我们什么时候需要在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" 
(弗雷德的回答已经说明了这一点,但是他的例子太抽象了)