如何使bash脚本获取带空格的文件名?

时间:2016-08-09 16:50:09

标签: bash shell csv ifs

我有一个像这样的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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

你需要在反引号内加双引号。外套不够。

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

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

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

答案 1 :(得分:1)

展开@JohnKugelman's answer

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

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