0

我有一个这样的 bash 脚本:

myfiles=("file\ with\ spaces.csv")

for file_name in "${myfiles[@]}"
do
        echo "removing first line of file $file_name"
        echo "first line is `head -1 $file_name`"
        echo "\n"
done

但由于某种原因它无法识别空格,即使我用双引号将其括起来""

head: cannot open ‘file\\’ for reading: No such file or directory

我该如何解决?

4

2 回答 2

4

您需要在反引号内使用双引号。外面的套装是不够的。

echo "first line is `head -1 "$file_name"`"

另外,不要在文件名中加上反斜杠,因为它已经被引用了。引号或反斜杠,但不能同时使用。

myfiles=("file with spaces.csv")
myfiles=(file\ with\ spaces.csv)
于 2016-08-09T16:51:23.310 回答
1

要扩展@JohnKugelman 的答案

  • 在 Bash 中引用需要一些时间来适应。作为一个简单的规则,对没有特殊字符的静态字符串使用单引号,对带有变量的字符串使用双引号,$''对带有特殊字符的字符串使用引号。
  • 每个命令替换都有一个单独的引用上下文。
  • $()是建立命令替换的更清晰的方法,因为它可以更容易嵌套。

因此,您通常会编写myfiles=('file with spaces.csv')and echo "first line is $(head -1 "$file_name")"

于 2016-08-09T18:18:44.133 回答