如何在数组中存储目录列表?

时间:2012-07-20 17:12:46

标签: arrays bash directory

为什么这不列出任何东西?谢谢

FOLDER=()

ls /tmp/backup/ | while read DIR
do
    FOLDER+=("$DIR")
done

echo ${FOLDER[1]}

4 个答案:

答案 0 :(得分:8)

分析

您的示例旨在失败。例如:

  • 不解析ls
  • 的输出
  • 不要假设目录中的每个条目都是目录。
  • 在没有充分理由的情况下,不要将数组附加到循环中。
  • 不要使用不带引号的变量。

使用Shell Globs

假设/ tmp / backup中的每个条目都是一个目录,您只需使用shell globs来填充数组。如果您可能有文件和目录条目,那么您需要使用 find 或使用shell测试表达式来确保该条目实际上是一个目录。例如:

# Enable special handling to prevent expansion to a
# literal '/tmp/backup/*' when no matches are found. 
shopt -s nullglob

FOLDERS=(/tmp/backup/*)
for folder in "${FOLDERS[@]}"; do
    [[ -d "$folder" ]] && echo "$folder"
done

# Unset shell option after use, if desired. Nullglob
# is unset by default.
shopt -u nullglob

答案 1 :(得分:3)

要解决subshel​​lissue(参见Diego的答案),你也可以做类似

的事情
while ....
done <<<$(ls)

答案 2 :(得分:1)

while在子shell中执行,它不能修改父变量,在本例中为FOLDER。你应该尝试其他方式。例如:

FOLDER=(`ls /tmp/backup`)
echo ${FOLDER[1]}

(将在那里打印第二个文件)

注意:是的,我了解此解决方案的问题,空格,ls的使用等。我只想指出while的问题。要完成答案,是的,应该使用globbing:

for dir in /tmp/backup/* ; do
    test -d "$dir" && do_stuff_with_dir("$dir")
done

并且,通过不死于纯粹主义,通常(至少在UNIX中) NOT 在文件名中有空格。这对你的健康有害:)

答案 3 :(得分:0)

正如其他人已经提到的,上面代码的一个问题是在子shell中修改变量。另一种是使用+=来填充数组。不幸的是,这只是将第0个元素添加为字符串,因此FOLDERS[1]保持未定义。