我尝试列出子文件夹并将它们作为列表保存到变量
DIRS=($(find . -maxdepth 1 -mindepth 1 -type d ))
之后我想在子文件夹中做一些工作。即。
for item in $DIRS
do
echo $item
但
之后echo $DIRS
它只提供第一项(子文件夹)。有人会指出我错误或提出另一种解决方案吗?
答案 0 :(得分:1)
以下内容创建了一个bash数组,但只列出了三个子目录中的一个:
$ dirs=($(find . -maxdepth 1 -mindepth 1 -type d ))
$ echo $dirs
./subdir2
要查看所有目录,您必须使用[@]
或[*]
下标表单:
$ echo "${dirs[@]}"
./subdir2 ./subdir1 ./subdir3
或者,在循环中使用它:
$ for item in "${dirs[@]}"; do echo $item; done
./subdir2
./subdir1
./subdir3
请注意,在上面的代码中,shell在创建数组之前执行分词。因此,如果任何子目录的名称中有空格,则此方法将失败。
以下将成功创建一个子目录名称数组,即使这些名称中包含空格,制表符或换行符:
dirs=(*/)
如果您需要使用find
,并且希望它对于困难的文件名是安全的,请使用查找--exec
选项。
表单$dirs
只返回数组的第一个元素。这在man bash
:
引用不带下标的数组变量等效于引用下标为0的数组。
[@]
中还记录了[*]
和man bash
的使用情况:
可以使用$ {name [subscript]}引用数组的任何元素。需要大括号以避免与路径名扩展冲突。如果下标是@或,则该单词将扩展为name的所有成员。这些下标仅在单词出现在双引号内时有所不同。如果单词是双引号,则$ {name []}扩展为单个单词,每个数组成员的值由IFS特殊变量的第一个字符分隔,$ {name [@]}展开名称的每个元素都是一个单独的单词。