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[@]}"