`sort`和`ls`返回数组?如果没有,为什么我们可以迭代而不必$ {x [@]}

时间:2018-04-10 08:18:17

标签: bash shell zsh

我刚刚注意到我可以写:

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语句只是以空格作为分隔符循环,我错了吗?那么我应该使用带空格的字符串来循环而不是数组吗?

我不太了解技术术语,对不起令人困惑的问题。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

来自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会在该列表中替换itemsIFS的第一个字符分隔的,它是一个默认为空格的特殊变量。

因此,您部分正确:for以空格作为分隔符进行循环,但sortls都不返回以空格分隔的字符串。就此而言,运行ls | xxd以查看输出的二进制转储 - 目录中的文件名由0x0a分隔,这是换行符的ASCII。