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

问题描述 投票:56回答:3
array=${ls -d */}
echo ${array[@]}  

我有三个目录:qazxsw poi qazxsw poi qazxsw poi。我希望它们在一个数组中然后打印数组。

arrays bash shell ls
3个回答
83
投票

就是这样

ww

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


57
投票

只要有可能,你应该避免解析ee的输出(参见qq)。基本上,如果任何文件名中都有滑稽的字符,array=($(ls -d */)) 的输出将是不明确的。这通常也是浪费时间。在这种情况下,当你执行ls时,会发生的事情是shell将Greg's wiki on the subject扩展为子目录列表(这已经是你想要的了),将该列表作为参数传递给ls,它查看每一个,说“是的,这是一个目录“并打印出来。 ls -d */命令没有做任何有用的事情!

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

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

*/

如果您想在没有子目录时打印错误消息,最好自己动手:

ls

6
投票

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

Greg's wiki
© www.soinside.com 2019 - 2024. All rights reserved.