大括号($var
vs. ${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
对比"$var"
对比"${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
vs.一样${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
. 但是,如果您的字符串中有很多引号,则这些替代形式可能难以阅读(因此难以维护)。这个页面很好地介绍了 Bash 中的引用。
数组($var
对比$var[@]
对比${var[@]}
)
现在为您的阵列。根据bash手册:
引用不带下标的数组变量等价于引用下标为 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[@]
这个页面很好地介绍了 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