为什么这不列出任何东西?谢谢
FOLDER=()
ls /tmp/backup/ | while read DIR
do
FOLDER+=("$DIR")
done
echo ${FOLDER[1]}
答案 0 :(得分:8)
您的示例旨在失败。例如:
ls
。假设/ 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)
要解决subshellissue(参见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]
保持未定义。