扩展bash数组的规则

时间:2013-06-07 10:52:01

标签: bash

根据我的bash手册页:If the word is double-quoted ${name[@]} expands each element of name to a separate word

这通常会导致预期的行为:

$ a=("foo 1" "bar 2")
$ for i in "${a[@]}"; do echo $i; done
foo 1
bar 2
$ size(){ echo $#;};size "${a[@]}"
2
$ [ "${a[@]}" = "foo 1 bar 2" ]&&echo ok
bash: [: too many arguments

但有时却没有:

$ [[ "${a[@]}" == "foo 1 bar 2" ]] && echo ok
ok
$ case "${a[@]}" in "foo 1 bar 2") echo ok; esac
ok

在这些情况下,它似乎被评估为单个字符串。 - 这很有道理,但有点令人惊讶。 - 我希望它等于"foo 1" "bar 2",因此会导致语法错误。

是否有规则在哪个上下文中评估哪种方式? (我在bash手册页中找不到正确的部分。)

其他问题:是否存在"${a[@]}"处理与${a[@]}不同的情况?

2 个答案:

答案 0 :(得分:2)

[[没有执行任何分词或全局扩展。

来自Bash FAQ

Since word splitting is not performed when expanding shell variables in all
operands of the [[ command, this allows users to quote patterns as they wish
when assigning the variable, then expand the values to a single string that
may contain whitespace.

此外,请参阅Word Splitting

  • 不会对{4}和[[ ... ]]等Bash关键字中的扩展执行单词拆分。
  • 不会对分配中的扩展执行单词拆分。因此,不需要在这样的命令中引用任何内容:
    • case
    • foo=$bar
    • bar=$(a command)
    • logfile=$logdir/foo-$(date +%Y%m%d)

答案 1 :(得分:-1)

该手册页确实说to a separate word并没有说into one word。数组"${a[@]}""foo 1 bar 1"不同。这只返回1个大字符串:

for i in "foo 1 bar 1"; do echo $i; done