Arrays bash数组语法和循环,请解释
我对bash中的数组语法感到困惑。我通常使用引号括住要循环的字符串,但教程通常使用括号。对于踢腿,我做了4个简单的循环。前两个通过回显数组中的每个项而工作,正如我所期望的,后两个给出了意外的输出 为什么会发生这种情况 回路#1 环路#2 环路#3 环路#4Arrays bash数组语法和循环,请解释,arrays,bash,quotes,Arrays,Bash,Quotes,我对bash中的数组语法感到困惑。我通常使用引号括住要循环的字符串,但教程通常使用括号。对于踢腿,我做了4个简单的循环。前两个通过回显数组中的每个项而工作,正如我所期望的,后两个给出了意外的输出 为什么会发生这种情况 回路#1 环路#2 环路#3 环路#4 前3个代码段应该可以工作,但第3个代码段的问题是List=“item1 item2 item3”将item1替换为“item1 item2 item3”,这就是您获得输出的原因 item1 item2 item3 item2 item3
前3个代码段应该可以工作,但第3个代码段的问题是
List=“item1 item2 item3”
将item1
替换为“item1 item2 item3”
,这就是您获得输出的原因
item1
item2
item3
item2
item3
更改变量的名称,它就会工作
List2="item1 item2 item3"
在最后一个代码片段中,$List
不带索引使用,这与引用数组List
的第一个元素的内容相同
前两个通过回显数组中的每个项而工作,正如我所期望的,后两个给出了意外的输出
第四个循环相当于${List[0]}中f的;do echo${f};完成
。这在manbash
中有记录:
引用不带下标的数组变量等同于引用下标为0的数组
第三个循环工作,但不打印原始数组。尝试:
List=(item1 item2 item3) # Declares array List
printf '%s\n' "${List[@]}"
item1
item2
item3
List="item1 item2 item3" # Overwrites first element of array...
# ... equivalent to List[0]="item1 item2 item3"
printf '%s\n' "${List[@]}"
item1 item2 item3
item2
item3
始终引用
${List[@]}
,否则就没有理由使用@
而不是*
。第一个和第三个数组根本不涉及任何数组。无引号字符串扩展!=数组…还有,这里有很多引用问题;将自动捕获它们,并提供带有解释的wiki链接。@Charles。我想你的评论正是我不理解的关键所在。如果你能给我指出一些资源,解释你所说的“无引号的字符串扩展!=array”和“一堆引用问题”,我将不胜感激。我只是不明白原因。(编辑:抱歉,我不知道如何使用格式)$LISTA=“item1 item2 item3”$printf'%s\n'${LIST6[2]}$LISTB=(item1 item2 item3)$printf'%s\n'${LIST7[2]}item3感谢您的输入。我已经用printf
替换了echo
,并引用了变量。是的,我的意思是List=“item1 item2 item3”
,我已经更新了答案。(竖起大拇指)re:answer-as-edited.Ah。我没意识到这是真的。如果我先跑#3,我就不会看到它,也不会知道它是这样工作的。谢谢
$ List=(item1 item2 item3)
$ for f in $List; do echo ${f}; done
item1
item1
item2
item3
item2
item3
List2="item1 item2 item3"
List=(item1 item2 item3) # Declares array List
printf '%s\n' "${List[@]}"
item1
item2
item3
List="item1 item2 item3" # Overwrites first element of array...
# ... equivalent to List[0]="item1 item2 item3"
printf '%s\n' "${List[@]}"
item1 item2 item3
item2
item3