提问人:bigdoyle 提问时间:5/5/2018 最后编辑:John Kugelmanbigdoyle 更新时间:5/5/2018 访问量:203
bash 数组语法和循环,请解释 [duplicate]
bash array syntax and loops, please explain [duplicate]
问:
这个问题在这里已经有答案了:
在 Bash 中循环遍历字符串数组? (21 个回答)
扩展 bash 数组仅给出第一个元素 (1 个答案)
元素中带有空格的 Bash 数组 (14 个答案)
为什么这个 for 循环不处理数组的所有元素? (3 个答案)
5年前关闭。
我对 bash 中的数组语法感到困惑。我通常使用引号将字符串括起来进行循环,但教程通常使用括号。对于踢球,我做了 4 个简单的循环。前两个通过回显数组中的每个项目来工作,正如我所期望的那样,后两个给出了意想不到的输出。
为什么会这样?
循环 #1
$ List="item1 item2 item3"
$ for f in $List; do echo ${f}; done
item1
item2
item3
循环 #2
$ List=(item1 item2 item3)
$ for f in ${List[@]}; do echo ${f}; done
item1
item2
item3
循环 #3
$ List="item1 item2 item3"
$ for f in ${List[@]}; do echo ${f}; done
item1
item2
item3
item2
item3
循环 #4
$ List=(item1 item2 item3)
$ for f in $List; do echo ${f}; done
item1
答:
0赞
haccks
5/5/2018
#1
前 3 个片段应该可以工作,但第 3 个片段的问题是它将替换为 这就是您获得输出的原因List="item1 item2 item3"
item1
"item1 item2 item3"
item1
item2
item3
item2
item3
更改变量的名称,它将起作用
List2="item1 item2 item3"
在最后一个片段中,不带索引,这与引用数组的第一个元素的内容相同。$List
List
评论
0赞
bigdoyle
5/5/2018
啊。我没有意识到这正在发生。如果我先运行#3,我就不会看到它,也不会知道它是这样工作的。谢谢。
1赞
builder-7000
5/5/2018
#2
前两个通过回显数组中的每个项目来工作,正如我所期望的那样,后两个给出了意想不到的输出。
第四个循环等价于 。这记录在:for f in ${List[0]}; do echo ${f}; done
man bash
引用不带下标的数组变量等同于引用下标为 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
评论
0赞
builder-7000
5/5/2018
感谢您的输入。我已替换并引用了该变量。echo
printf
0赞
builder-7000
5/5/2018
是的,我的意思是,我已经更新了答案。List="item1 item2 item3"
1赞
Charles Duffy
5/5/2018
(竖起大拇指)回复:编辑后回答。
评论
${List[@]}
@
*