4

我知道处理文件名中的空格的一种技术是用单引号将文件名括起来:“'”。

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

回声.sh

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

产生
'ab c''de f''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':没有这样的文件或目录

4

4 回答 4

7

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

试试这个:

#!/bin/sh
for f in *
do
ls "$f"
done
于 2013-03-19T21:50:12.907 回答
2

更改以下行

ls "'$f'"

进入

ls "$f"
于 2013-03-19T21:44:44.423 回答
2

仔细查看 echo.sh 脚本的输出,您可能会注意到结果可能与您预期的不太一样,因为打印的每一行都被以下'字符包围:

'file-1'
'file-2'

等等。

您的系统上确实不存在具有该名称的文件。将它们与lsls 一起使用将尝试查找名为'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
于 2013-03-19T21:45:57.587 回答
1

那这个呢 ?=)

#!/bin/sh
for f in *; do
    printf -- '%s\n' "$f"
done
于 2013-03-19T21:53:04.100 回答