【发布时间】:2010-09-22 23:55:07
【问题描述】:
我有一个 bash shell 脚本,它遍历某个目录的所有子目录(但不是文件)。问题是某些目录名称包含空格。
这是我的测试目录的内容:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
以及遍历目录的代码:
for f in `find test/* -type d`; do
echo $f
done
这是输出:
测试/巴尔的摩 测试/樱桃 爬坡道 测试/爱迪生 测试/新 约克 城市 测试/费城Cherry Hill 和 New York City 被视为 2 或 3 个单独的条目。
我尝试引用文件名,如下所示:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
但无济于事。
必须有一个简单的方法来做到这一点。
下面的答案很棒。但是为了使这更复杂 - 我并不总是想使用我的测试目录中列出的目录。有时我想将目录名称作为命令行参数传递。
我接受了 Charles 关于设置 IFS 的建议,并提出了以下建议:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
除非命令行参数中有空格(即使这些参数被引用),否则它工作得很好。例如,像这样调用脚本:test.sh "Cherry Hill" "New York City" 会产生以下输出:
【问题讨论】:
-
re: 编辑,
list="$@"完全丢弃原始值的列表性,将其折叠为字符串。请完全按照给定遵循我的回答中的做法——在其中的任何地方都不鼓励这样的分配;如果你想将命令行参数列表传递给程序,你应该将它们收集到一个数组中,然后直接展开该数组。
标签: bash loops whitespace