扩展bash数组的规则

扩展bash数组的规则,bash,Bash,根据我的bash手册:如果单词是双引号的${name[@]}将name的每个元素扩展为一个单独的单词 这通常会导致准确的预期行为: $ 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 argumen

根据我的bash手册:
如果单词是双引号的${name[@]}将name的每个元素扩展为一个单独的单词

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

$ 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[@]}
的处理方式不同?

手册页确实对一个单独的单词说了
,而没有对一个单词说
。数组a
“${a[@]}”
“foo 1 bar 1”
不同。这只返回1个大字符串:

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

手册页确实对一个单独的单词说了
,而没有对一个单词说
。数组a
“${a[@]}”
“foo 1 bar 1”
不同。这只返回1个大字符串:

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

没有对
[[
执行分词或全局扩展

发件人:

此外,请参阅:

  • 在Bash关键字(如
    […]]
    大小写
    )内的扩展上不执行分词
  • 在赋值中不对扩展执行分词。因此,不需要在命令中引用以下内容:
    • foo=$bar
    • bar=$(一个命令)
    • logfile=$logdir/foo-$(日期+%Y%m%d)
    • PATH=/usr/local/bin:$PATH./myscript

    • [[
      不执行分词或全局扩展

      发件人:

      此外,请参阅:

      • 在Bash关键字(如
        […]]
        大小写
        )内的扩展上不执行分词
      • 在赋值中不对扩展执行分词。因此,不需要在命令中引用以下内容:
        • foo=$bar
        • bar=$(一个命令)
        • logfile=$logdir/foo-$(日期+%Y%m%d)
        • PATH=/usr/local/bin:$PATH./myscript

      删除
      并使用
      ${a[@]}
      而不是
      “${a[@]}”
      案例${a[@]}在“foo 1 bar 2”中回显ok;esac
->okUse
设置-xv
查看bash如何处理命令。删除
并使用
${a[@]}
而不是
${a[@>在案例{foo 1 bar中)echo ok;esac
->ok使用
set-xv
查看bash如何处理命令。确切地说,在第一个示例中,它被计算为单独的单词。在第二个示例中,它被计算为单独的单词。-这是令人惊讶的,也是问题的原因。确切地说,在第一个示例中,它被计算为单独的单词。在第二个例子,它被评价成一个单词。-这是令人惊讶的,也是问题的原因。