“排序”和“ls”返回数组吗?如果不是,为什么我们可以迭代而不必 ${x[@]}



我刚刚注意到我可以写:

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

我怀疑sortls只返回带有空格的普通字符串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确实使用空格作为分隔符进行循环,但sortls都不返回空格分隔的字符串。就此而言,请运行 ls | xxd 以查看输出的二进制转储 - 目录中的文件名由 0x0a 分隔,这是换行符的 ASCII。

最新更新