大括号($var 与 ${var})
在大多数情况下,$var 和 ${var} 是相同的:
var=foo
echo $var
# foo
echo ${var}
# foo
大括号仅用于解决表达式中的歧义:
var=foo
echo $varbar
# Prints nothing because there is no variable 'varbar'
echo ${var}bar
# foobar
行情($var vs. "$var" vs. "${var}")
当您在变量周围添加双引号时,您告诉 shell 将其视为一个单词,即使它包含空格:
var="foo bar"
for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
echo $i # so only runs the loop once
done
# foo bar
将该行为与以下内容进行对比:
var="foo bar"
for i in $var; do # Expands to 'for i in foo bar; do...'
echo $i # so runs the loop twice, once for each argument
done
# foo
# bar
与$var 与${var} 一样,大括号仅用于消除歧义,例如:
var="foo bar"
for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
echo $i # variable named 'varbar', so loop runs once and
done # prints nothing (actually "")
var="foo bar"
for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
echo $i # so runs the loop once
done
# foo barbar
请注意,上面第二个示例中的"${var}bar" 也可以写作"${var}"bar,在这种情况下,您不再需要大括号,即"$var"bar。但是,如果您的字符串中有很多引号,则这些替代形式可能难以阅读(因此难以维护)。 This page 很好地介绍了 Bash 中的引用。
数组($var vs. $var[@] vs. ${var[@]})
现在为您的阵列。根据bash manual:
引用不带下标的数组变量等价于引用下标为0的数组。
换句话说,如果你不提供[]的索引,你会得到数组的第一个元素:
foo=(a b c)
echo $foo
# a
和这个完全一样
foo=(a b c)
echo ${foo}
# a
要获取数组的所有元素,您需要使用@ 作为索引,例如${foo[@]}。数组需要大括号,因为没有它们,shell 将首先扩展 $foo 部分,给出数组的第一个元素,然后是文字 [@]:
foo=(a b c)
echo ${foo[@]}
# a b c
echo $foo[@]
# a[@]
This page 很好地介绍了 Bash 中的数组。
重新访问引用(${foo[@]} 与 "${foo[@]}")
您没有问过这个问题,但这是一个很好了解的细微差别。如果数组中的元素可能包含空格,则需要使用双引号,以便将每个元素视为单独的“单词:”
foo=("the first" "the second")
for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
echo $i # so the loop runs twice
done
# the first
# the second
将此与不带双引号的行为进行对比:
foo=("the first" "the second")
for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
echo $i # so the loop runs four times!
done
# the
# first
# the
# second