如何在 Linux Bash 中将 ls 分配给数组


array=${ls -d */}
echo ${array[@]}  

我有三个目录:ww ee qq .我希望它们在一个数组中,然后打印数组。

会是这个

array=($(ls -d */))

编辑:请参阅Gordon Davisson的解决方案以获得更一般的答案(即,如果您的文件名包含特殊字符)。这个答案只是一个语法更正。

只要有可能,你应该避免解析ls的输出(参见Greg关于这个主题的wiki)。基本上,如果任何文件名中有有趣的字符,ls的输出将是模棱两可的。这通常也是浪费时间。在这种情况下,当您执行 ls -d */ 时,发生的情况是 shell */扩展到子目录列表(这已经是您想要的),将该列表作为参数传递给 ls -d ,它会查看每个目录,说"是的,这是一个目录"并打印它(以不一致且有时模棱两可的格式)。ls命令没有任何用处!

好吧,好吧,它正在做一件有用的事情:如果没有子目录,*/将保持原样,ls将查找名为"*"的子目录,而不是找到它,打印一条错误消息它不存在(到 stderr),而不是打印"*/"(到 stdout)。

制作子目录名称数组的更简洁的方法是使用 glob ( */而不将其传递给 ls 。但是为了避免在没有实际子目录的情况下将"*/"放入数组中,您应该先设置 nullglob(再次参见 Grag 的 wiki):

shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}"  # Note double-quotes to avoid extra parsing of funny characters in filenames

如果您想在没有子目录的情况下打印错误消息,最好自己打印

if (( ${#array[@]} == 0 )); then
    echo "No subdirectories found" >&2
fi

这将逐行打印这些目录中的文件。

array=(ww/* ee/* qq/*)
printf "%sn" "${array[@]}"

最新更新