小编典典

Bash shell 中的 ${var}、"$var" 和 "${var}" 有什么区别?

all

标题说什么:将变量封装在 , 或 ” 中是什么意思{}"""{}无法在网上找到任何关于此的解释 -
除了使用符号外,我无法参考它们,其中不产生任何东西。

这是一个例子:

declare -a groups

groups+=("CN=exampleexample,OU=exampleexample,OU=exampleexample,DC=example,DC=com")
groups+=("CN=example example,OU=example example,OU=example example,DC=example,DC=com")

这个:

for group in "${groups[@]}"; do
    echo $group
done

事实证明与此有很大不同:

for group in $groups; do
    echo $group
done

和这个:

for group in ${groups}; do
    echo $group
done

只有第一个完成了我想要的:遍历数组中的每个元素。我不太清楚$groups,"$groups"和之间${groups}的区别"${groups}"。如果有人能解释一下,我将不胜感激。

作为一个额外的问题 - 有没有人知道引用这些封装的公认方式?


阅读 203

收藏
2022-08-01

共1个答案

小编典典

大括号($varvs. ${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

$varvs.一样${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
2022-08-01