我想将目录中的所有文件名放入变量中。我写如下:
DATA=`ls`
for LOOP in $DATA
do
echo $LOOP
done
但是有一些文件名包含空格。然后名为“A B.txt”的文件将被解释为两个文件“A”和“B.txt”。
如何解决这个问题呢?
不要解析 的输出ls
,这几乎总是会给你带来麻烦。
只需使用:
for loop in * ; do
echo "$loop"
done
虽然不解析ls
输出的建议是普遍的智慧,但可以强制命令输出可解析的数据:
`ls -b`
将用 C 样式转义替换非图形字符,包括空格。
然而,这不适用于 shell for 循环,但是当输出通过管道发送到另一个命令时可以使用。
例子:
$ ls -b
A\ B.txt C.txt
在 for 循环中失败:
$ for i in $(ls -b) ; do echo $i ; done
A\
B.txt
C.txt
但通过管道发送时有效
$ ls -b | xargs -n 1 echo
A B.txt
C.txt