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

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

我有三个目录: ww ee qq 。 我想他们在一个数组,然后打印数组。

这将是这个

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

编辑:请参阅戈登·戴维森的解决scheme为更一般的答案(即如果您的文件名包含特殊字符)。 这个答案只是一个语法修正。

只要有可能,你应该避免parsingls的输出(参见Greg关于这个主题的wiki )。 基本上,如果在任何文件名中都有有趣的字符, ls的输出将是不明确的。 这通常也是浪费时间。 在这种情况下,当你执行ls -d */ ,会发生什么情况是shell将*/扩展到子目录列表(这已经正是你想要的),把这个列表作为parameter passing给ls -d ,每个人都说,“是的,这是一个目录”,并打印出来。 ls命令没有做任何有用的事情!

那么,好吧,它正在做一件有用的事情:如果没有子目录, */将保持原样, ls将查找名为“*”的子目录,找不到它,打印一条错误消息存在(到stderr), 并不打印“* /”(到标准输出)。

build立一个子目录名称数组的更简洁的方法是使用glob( */而不将它传递给ls 。 但是为了避免在数组中放入“* /”,如果没有实际的子目录,你应该先设置nullglob(再次参见Greg的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 "%s\n" "${array[@]}" 

您可以使用ls-m选项。

 ARR=($(\ls -m * |tr"," " "| tr ":" " ")) echo ${ARR[@]}