Bash shell中的${var},“$var”和“${var}”有什么区别?

前端之家收集整理的这篇文章主要介绍了Bash shell中的${var},“$var”和“${var}”有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
标题说:在{},“”或“{}”中封装一个变量是什么意思?我没有能够在网上找到任何解释 – 我没有能够参考他们,除了使用符号,这不产生任何东西。

这里有一个例子:

  1. declare -a groups
  2.  
  3. groups+=("CN=exampleexample,OU=exampleexample,DC=example,DC=com")
  4. groups+=("CN=example example,OU=example example,DC=com")

这个:

  1. for group in "${groups[@]}"; do
  2. echo $group
  3. done

证明与此有很大的不同:

  1. for group in $groups; do
  2. echo $group
  3. done

和这个:

  1. for group in ${groups}; do
  2. echo $group
  3. done

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

作为一个额外的问题 – 有没有人知道接受的方式来引用这些封装?

大括号($ var vs. $ {var})

在大多数情况下,$ var和$ {var}是相同的:

  1. var=foo
  2. echo $var
  3. # foo
  4. echo ${var}
  5. # foo

大括号只需要解决表达式中的歧义:

  1. var=foo
  2. echo $varbar
  3. # Prints nothing because there is no variable 'varbar'
  4. echo ${var}bar
  5. # foobar

引用($ var vs.“$ var”vs.“$ {var}”)

当你在变量上加上双引号时,你可以告诉shell把它当作一个单词,即使它包含空格:

  1. var="foo bar"
  2. for i in "$var"; do # Expands to 'for i in "foo bar"; do...'
  3. echo $i # so only runs the loop once
  4. done
  5. # foo bar

对比与以下行为:

  1. var="foo bar"
  2. for i in $var; do # Expands to 'for i in foo bar; do...'
  3. echo $i # so runs the loop twice,once for each argument
  4. done
  5. # foo
  6. # bar

与$ var vs. $ {var}一样,大括号只需要消除歧义,例如:

  1. var="foo bar"
  2. for i in "$varbar"; do # Expands to 'for i in ""; do...' since there is no
  3. echo $i # variable named 'varbar',so loop runs once and
  4. done # prints nothing (actually "")
  5.  
  6. var="foo bar"
  7. for i in "${var}bar"; do # Expands to 'for i in "foo barbar"; do...'
  8. echo $i # so runs the loop once
  9. done
  10. # foo barbar

注意,上面第二个例子中的“$ {var} bar”也可以写成“$ {var}”bar,在这种情况下你不再需要大括号,即“$ var”bar。但是,如果你的字符串中有很多引号,这些替代形式可能很难阅读(因此很难维护)。 This page提供了在Bash中引用的一个很好的介绍。

数组($ var vs. $ var [@] vs. $ {var [@]})

现在为你的数组。根据bash manual

Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 0.

换句话说,如果你不使用[]提供索引,你会得到数组的第一个元素:

  1. foo=(a b c)
  2. echo $foo
  3. # a

这是完全一样的

  1. foo=(a b c)
  2. echo ${foo}
  3. # a

获取数组的所有元素,您需要使用@作为索引,例如。 $ {foo [@]}。大括号是数组必需的,因为没有它们,shell会首先展开$ foo部分,给出数组的第一个元素,后面跟一个文字[@]:

  1. foo=(a b c)
  2. echo ${foo[@]}
  3. # a b c
  4. echo $foo[@]
  5. # a[@]

This page是Bash中数组的一个很好的介绍。

重新查看的报价($ {foo [@]}与“$ {foo [@]}”)

你没有问这个,但它是一个微妙的差别,是很好知道。如果数组中的元素可以包含空格,则需要使用双引号,以便将每个元素视为单独的“word:”。

  1. foo=("the first" "the second")
  2. for i in "${foo[@]}"; do # Expands to 'for i in "the first" "the second"; do...'
  3. echo $i # so the loop runs twice
  4. done
  5. # the first
  6. # the second

与没有双引号的行为对比:

  1. foo=("the first" "the second")
  2. for i in ${foo[@]}; do # Expands to 'for i in the first the second; do...'
  3. echo $i # so the loop runs four times!
  4. done
  5. # the
  6. # first
  7. # the
  8. # second

猜你在找的Bash相关文章