据我所知,处理文件名中的空格的一种方法是用单引号括起文件名:“'”。
为什么以下代码调用“echo.sh”在包含带空格的文件名的目录上工作,但程序“ls.sh”不起作用,其中唯一的区别是'echo'替换为'ls “?
echo.sh
#!/bin/sh
for f in *
do
echo "'$f'"
done
可生产:
'a b c'
'd e f'
'echo.sh'
'ls.sh'
但是,“ls.sh”失败了:
#!/bin/sh
for f in *
do
ls "'$f'"
done
可生产:
ls:无法访问'a b c':没有这样的文件或目录
ls:无法访问'd e f':没有这样的文件或目录
ls:无法访问'echo.sh':没有这样的文件或目录
ls:无法访问'ls.sh':没有这样的文件或目录
答案 0 :(得分:6)
你实际上是在添加多余的“'”(你的echo调用显示了)
试试这个:
#!/bin/sh
for f in *
do
ls "$f"
done
答案 1 :(得分:2)
从
更改以下行ls "'$f'"
到
ls "$f"
答案 2 :(得分:2)
仔细查看echo.sh脚本的输出,您可能会注意到结果可能不是您所期望的结果,因为打印的每一行都被'
个字符所包围:
'file-1'
'file-2'
等等。
系统上确实存在具有该名称的文件。将它们与ls
ls一起使用将尝试查找名为'file-1'
而不是file-1
的文件,并且不存在具有此类名称的文件。
在您的示例中,您刚刚添加了一对'
s太多。一对双引号"
足以处理文件名中可能包含的空格:
#!/bin/sh
for f in *
do
ls "$f"
done
即使文件名包含空格,也能正常工作。如果你没有像$f
一样使用双引号,那么你试图避免的问题就出现了:
#!/bin/sh
for f in *
do
ls $f # you might get into trouble here
done
答案 3 :(得分:1)
这个怎么样? =)
#!/bin/sh
for f in *; do
printf -- '%s\n' "$f"
done