大括号($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
vs. "$var"
vs."${var}"
)
在变量周围加上双引号时,即使外壳包含空格,也要告诉外壳将其视为一个单词:
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
vs. $var[@]
vs.${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[@]}
vs. "${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
bash
脚本中的参数?