标题说什么:将变量封装在 , 或 ” 中是什么意思{}?""我"{}无法在网上找到任何关于此的解释 - 除了使用符号外,我无法参考它们,其中不产生任何东西。
{}
""
"{}
这是一个例子:
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}"。如果有人能解释一下,我将不胜感激。
$groups
"$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}"
当您在变量周围添加双引号时,您告诉 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}bar"
"${var}"bar
"$var"bar
$var[@]
${var[@]}
现在为您的阵列。根据bash手册:
引用不带下标的数组变量等价于引用下标为 0 的数组。
换句话说,如果你不提供索引[],你会得到数组的第一个元素:
[]
foo=(a b c) echo $foo # a
这与
foo=(a b c) echo ${foo} # a
要获取数组的所有元素,您需要将其@用作索引,例如${foo[@]}. 数组需要大括号,因为没有它们,shell 将$foo首先扩展该部分,给出数组的第一个元素,后跟一个文字[@]:
@
${foo[@]}
$foo
[@]
foo=(a b c) echo ${foo[@]} # a b c echo $foo[@] # a[@]
这个页面很好地介绍了 Bash 中的数组。
"${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