我们在何时需要对Shell变量使用花括号?

2024-05-27 15:56:22 浏览数 (2)

问题

在Shell脚本中,在什么情况下需要在变量扩展时使用 {}

例如,我见过以下用法:

代码语言:javascript复制
var=10        # 声明变量

echo "${var}" # 变量的一种使用方式
echo "$var"   # 变量的另一种使用方式

这两者有显著的区别吗,还是仅仅是一种风格?是否有一种是更受推荐的?


回答

在上述特定的示例代码中,没有区别。但是,当你想要在字符串中扩展变量 foo 时,${} 中的 {} 是有用的:

代码语言:javascript复制
"${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

0 人点赞