我有一个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
这是输出:
测试/巴尔的摩 测试/樱桃 爬坡道 测试/爱迪生 测试/新 约克 市 测试/费城
樱桃山和纽约市被视为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"
产生以下输出:
樱桃 爬坡道 新 约克 市
list="$@"
完全丢弃原始值的列表性,将其折叠为字符串。请严格按照我给出的答案进行操作 -不鼓励在其中的任何地方进行此类作业;如果要将命令行参数列表传递给程序,则应将它们收集到一个数组中,然后直接扩展该数组。