Shell脚本问题,包含空格的文件名

我知道处理文件名空间的一种方法是用单引号括起文件名:“'”。

为什么下面的代码叫做“echo.sh”,在包含带空格的文件名的目录下工作,但程序“ls.sh”不起作用,唯一的区别是'echo'被'ls'replace?

echo.sh

#!/bin/sh for f in * do echo "'$f'" done 

生产
'ABC'
“高清”
'echo.sh'
'ls.sh'

但是,“ls.sh”失败:

 #!/bin/sh for f in * do ls "'$f'" done 

生产
ls:不能访问'ab c':没有这样的文件或目录
ls:不能访问'de f':没有这样的文件或目录
ls:不能访问'echo.sh':没有这样的文件或目录
ls:不能访问'ls.sh':没有这样的文件或目录

Solutions Collecting From Web of "Shell脚本问题,包含空格的文件名"

你实际上添加了多余的“'”(你的echo调用显示)

尝试这个:

 #!/bin/sh for f in * do ls "$f" done 

从下面的行改变

 ls "'$f'" 

 ls "$f" 

仔细看看你的echo.sh脚本的输出,你可能会注意到,结果可能不是你所期望的,因为每行打印都被'字符包围:

 'file-1' 'file-2' 

等等。

具有该名称的文件实际上不存在于您的系统上。 与ls ls一起使用它们将尝试查找名为'file-1'而不是file-1的文件,并且具有这种名称的文件不存在。

在你的例子中,你只是添加了一对太多。 一对双引号足以照顾可能包含在文件名中的空格:

 #!/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 

那这个呢 ? =)

 #!/bin/sh for f in *; do printf -- '%s\n' "$f" done