问题
在Shell脚本中,在什么情况下需要在变量扩展时使用 {}
?
例如,我见过以下用法:
代码语言:javascript复制var=10 # 声明变量
echo "${var}" # 变量的一种使用方式
echo "$var" # 变量的另一种使用方式
这两者有显著的区别吗,还是仅仅是一种风格?是否有一种是更受推荐的?
回答
在上述特定的示例代码中,没有区别。但是,当你想要在字符串中扩展变量 foo
时,${}
中的 {}
是有用的:
"${foo}bar"
因为 "$foobar"
将会扩展变量 foobar
,而不是预期的变量 foo
。
变量名的结尾后面通常是空格或换行符。但如果我们不想在打印变量值后接着打印空格或换行怎么办?这时就需要用花括号告诉 Shell 解释器变量名的结束位置。
花括号还无条件需要在以下情况下使用:
- 扩展数组元素,如:
${array[5]}
- 使用参数扩展操作,如:
${filename%.*}
(移除扩展名;剥离最小的匹配) - 扩展总数超过 9 的位置参数,如:"{10} {11}"
在所有情况下都使用 {},而不仅仅是在可能产生歧义的情况下,可以被认为是良好的编程实践。这既是为了一致性,也是为了避免像 foo_bar.jpg 这样的意外,其中下划线成为变量名的一部分并不明显。
你还可以在花括号内进行一些文本操作:
代码语言:javascript复制STRING="./folder/subfolder/file.txt"
echo ${STRING}
echo ${STRING%/*} #从右向左查找匹配,并将匹配的部分删除
echo ${STRING%/*/*}
或者
代码语言:javascript复制STRING="This is a string"
echo ${STRING// /_} #字符串替换
朋友们可以执行测试一下上述命令,看输出什么内容。
参考
- stackoverflow question 8748831
- https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion