gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:38:39 37 4
gpt4 key购买 nike

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

这是一个例子:

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}"${组}”。如果有人能解释一下,我将不胜感激。

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

最佳答案

大括号($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 对比 "$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${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 对比 $var[@] 对比 ${var[@]})

现在为您的阵列。根据bash manual :

Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 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

关于bash - Bash shell 中的 ${var}、 "$var"和 "${var}"之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18135451/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com