我们什么时候需要在shell变量上花括号?

在shell脚本中,扩展变量时什么时候使用{}

例如,我看到以下内容:

 var=10 # Declare variable echo "${var}" # One use of the variable echo "$var" # Another use of the variable 

有一个显着的差异,还是只是风格? 一个比另一个更受欢迎吗?

在这个特定的例子中,没有什么区别。 但是,如果要在字符串中扩展变量foo ,则${}中的${}非常有用

 "${foo}bar" 

因为"$foobar"会改为扩展foobar

在下列情况下,花括号也是无条件要求的:

  • 扩展数组元素,如${array[42]}
  • 使用参数扩展操作,如${filename%.*} (移除扩展名)
  • 将位置参数扩展到9以上: "$8 $9 ${10} ${11}"

在任何地方这样做,而不是仅仅在可能模棱两可的情况下,可以被认为是良好的编程实践。 这既是为了一致性,也是为了避免像$foo_$bar.jpg这样的$foo_$bar.jpg ,下划线变成变量名的一部分,在视觉上并不明显。

变量被声明和分配,没有$和没有{} 。 你必须使用

 var=10 

分派。 为了从变量中读取(换句话说,“展开”变量),您必须使用$

 $var # use the variable ${var} # same as above ${var}bar # expand var, and append "bar" too $varbar # same as ${varbar}, ie expand a variable called varbar, if it exists. 

这有时使我感到困惑 – 在其他语言中,我们用相同的方式引用变量,而不管它是在作业的左边还是右边。 但shell脚本是不同的, $var=10不会做你可能会认为它做的!

您可以使用{}进行分组。 花括号是需要取消引用数组元素。 例:

 dir=(*) # store the contents of the directory into an array echo "${dir[0]}" # get the first entry. echo "$dir[0]" # incorrect 

你也可以在大括号内进行一些文本处理:

 STRING="./folder/subfolder/file.txt" echo ${STRING} ${STRING%/*/*} 

结果:

 ./folder/subfolder/file.txt ./folder 

要么

 STRING="This is a string" echo ${STRING// /_} 

结果:

 This_is_a_string 

你是正确的“常规变量”是不需要的…但它是更有帮助的调试和阅读脚本。

变量名的结尾通常用空格或换行符表示。 但是如果打印变量值之后我们不想要空格或换行符呢? 花括号告诉shell解释器变量名的结尾。

例:

 TIME=10 # WRONG: no such variable called 'TIMEsecs' echo "Time taken = $TIMEsecs" # What we want is $TIME followed by "secs" with no whitespace between the two. echo "Time taken = ${TIME}secs" 

(弗雷德的回答已经说明了这一点,但是他的例子太抽象了)

Interesting Posts