哪种引用风格的 GNU Bash 变量定义(主要用于路径)?

Klo*_*rax 0 shell bash shell-script environment-variables quoting

对于GNU Bash变量,以下哪种引用样式是首选,为什么?

  1. 两个双引号: VAR="/path/$V1/path with space/$V2" .
  2. 多个双引号: VAR=/path/"$V1"/"path with space"/"$V2" .
  3. 组合: VAR="/path/"$V1"/path with space/"$V2""
  4. 其他

这里的首选意思是,在尽可能多的情况下按预期工作,而不会不必要地冗长,这样它就可以一致地使用而不会出现任何问题。如果有(罕见?)特殊情况,那么请将其限制为文件系统路径。

假设该path部分可以包含空格或特殊字符。对于2,这当然意味着这些path部分也需要引用。

基本上,这似乎可以归结为另一个问题:单独引用变量替换是否会做一些额外的事情?

如果这是真的,那么它将激发23(以避免必须path单独用空格引用每个部分)。如果不是,那么1似乎是首选,因为它是最简单的。

然而,在这里寻找例子,2是迄今为止最常见的,尽管作为一个特例VAR="$OTHER_VAR"/path/to/something

Kus*_*nda 5

主要的事情是:双引号包含任何形式的扩展或空格的所有字符串,除非您知道不允许这样做(参见例如“何时需要双引号? ”)。是否仅引用实际需要引用的位并保留引号外静态的非空白位并不那么重要。

我将一次一个地检查您的选择:

  1. VAR="/path/$V1/path with space/$V2"

    这是迄今为止最容易阅读的变体(个人意见)。所有变量扩展都被引用,并且字符串不会在空格上分割(因为它被引用)。我会使用这个选项。

    正如Sergiy Kolodyazhny 在评论中指出的,唯一要记住的是,如果路径名包含实际的文字双引号字符,则必须通过将其转义为\"或暂时终止双引号字符串并插入来处理a"在单引号字符串中,如"this is a string with a "'"'" in it". 同样,对于 shell 来说特殊的其他字符(例如$and\`)在双引号字符串中也需要进行相同的处理。请注意,如果在路径名字符串中扩展的变量包含这些字符之一(将被正确处理),则这不是问题

  2. VAR=/path/"$V1"/"path with space"/"$V2"

    这(恕我直言)看起来有点乱,但是有效。它在斜杠之间双引号所有/大多数路径组件。另一种方法可能是在不扩展变量的情况下使用单引号:

    VAR=/'path'/"$V1"/'path with space'/"$V2"
    
    Run Code Online (Sandbox Code Playgroud)

无论您使用第二个还是第一个选项,都取决于您和您的个人品味(或者您的团队在您正在从事的项目中使用的任何约定)。我建议您保留单一约定,如果可能的话,不要混合使用两者。

两种“引用路径名的方式”之间没有实际区别,除了路径名可能包含 shell 特有的文字字符(它们在单引号内不会特殊)以及引号的数量之外用过的

你还提到

  • VAR="$OTHER_VAR"/path/to/something

    我认为这绝对没有问题,当路径的其余部分是静态且不包含空格时,这是我最常用的。这和绝对没有区别VAR="$OTHER_VAR/path/to/something"


第三个选项:

  1. VAR="/path/"$V1"/path with space/"$V2""

    不要这样做。此处,$V1$V2实际上未加引号,因为您终止了变量扩展周围的双引号位。