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