2

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

FOLDER=()

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

echo ${FOLDER[1]}
4

4 回答 4

8

分析

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

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

使用 Shell Glob

假设 /tmp/backup 中的每个条目都是一个目录,您可以简单地使用 shell glob 来填充您的数组。如果您可能有文件和目录条目,那么您需要使用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
于 2012-07-20T17:24:58.473 回答
3

要解决 subshel​​lissue (请参阅 Diego 的答案),您还可以执行类似的操作

while ....
done <<<$(ls)
于 2012-07-20T17:21:38.603 回答
2

while在子 shell 中执行,它不能修改父的变量,在这种情况下,FOLDER. 你应该尝试其他方法。例如:

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

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

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

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

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

于 2012-07-20T17:18:32.520 回答
0

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

于 2012-07-20T17:41:02.733 回答