协慌网

登录 贡献 社区

什么时候需要在外壳变量周围加上花括号?

在 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类的意外情况,在下划线处,下划线成为变量名的一部分并不明显。

声明和分配变量时不带$和不带{} 。你必须用

var=10

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

$var      # use the variable
${var}    # same as above
${var}bar # expand var, and append "bar" too
$varbar   # same as ${varbar}, i.e 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