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

时间:2013-03-19 21:40:57

标签: linux bash shell command-line filenames

据我所知,处理文件名中的空格的一种方法是用单引号括起文件名:“'”。

为什么以下代码调用“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':没有这样的文件或目录

4 个答案:

答案 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