为什么这没有列出任何东西?谢谢
FOLDER=()
ls /tmp/backup/ | while read DIR
do
FOLDER+=("$DIR")
done
echo ${FOLDER[1]}
您的示例旨在失败。例如:
ls
.假设 /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
要解决 subshellissue (请参阅 Diego 的答案),您还可以执行类似的操作
while ....
done <<<$(ls)
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 中)文件名中没有空格。这对你的健康有害:)
正如其他人已经提到的,上面代码的一个问题是修改子shell中的变量。另一个+=
用于填充数组。不幸的是,这只是作为字符串添加到第零个元素,因此它FOLDERS[1]
保持未定义。