我刚刚注意到我可以写:
for i in $(sort $path); do
echo $i
done
它打印出来非常好。但是当涉及到数组时:
arr=(i am array)
for i in $arr; do
echo $i
done
# output (bash)
i
# outpus (zsh)
i
am
array
所以我必须用以下命令扩展数组:
for i in ${arr[@]}; do
echo $i
done
#output (bash)
i
am
array
我怀疑sort
和ls
只返回带有空格的普通字符串for
语句只是以空格作为分隔符循环,我错了吗?那么我应该使用带有空格的字符串而不是数组来循环吗?
我不太了解技术术语,很抱歉混淆问题。
提前谢谢你。
从bash
手册页:
for name [ [ in [ word ... ] ] ; ] do list ; done
The list of words following in is expanded, generating a list of
items. <...>
因此,当您编写for i in ${arr[@]}
或for i in $(sort $path)
时,shell 会替换list
来代替扩展,并且for
迭代该列表中由 IFS
的第一个字符分隔的items
,这是一个默认为空格的特殊变量。
因此,您部分正确:for
确实使用空格作为分隔符进行循环,但sort
和ls
都不返回空格分隔的字符串。就此而言,请运行 ls | xxd
以查看输出的二进制转储 - 目录中的文件名由 0x0a
分隔,这是换行符的 ASCII。