shell脚本中文件名中的空格

时间:2016-06-01 21:48:59

标签: bash shell

我有一个处理某些文件的shell脚本。问题是文件名中可能有空格,我做了:

#!/bin/sh
FILE=`echo $FILE | sed -e 's/[[:space:]]/\\ /g'`
cat $FILE

因此变量FILE是从其他程序传入的文件名。它可能包含空格。我使用sed使用\来转义空格,以使命令行实用程序能够处理它。

问题在于它不起作用。 echo $FILE | sed -e 's/[[:space:]]/\\ /g'本身按预期工作,但当分配给FILE时,转义字符\再次消失。因此,cat会将其解释为多于1个参数。我想知道它为什么会这样?反正有没有避免它?如果有多个空格,比如some terrible file.txt,应该用some\ \ \ terrible\ \ file.txt替换。感谢。

2 个答案:

答案 0 :(得分:2)

请勿尝试将转义字符放入数据中 - 它们仅仅被视为语法(也就是说,反斜杠在源代码中有意义,而不是你的数据)。

也就是说,以下内容完美无缺,完全如下:

file='some   terrible  file.txt'
cat "$file"

...同样,如果名称来自全球结果或类似名称:

# this operates in a temporary directory to not change the filesystem you're running it in
tempdir=$(mktemp -d "${TMPDIR:-/tmp}/testdir.XXXXXX") && (
  cd "$tempdir" || exit
  echo 'example' >'some  terrible  file.txt'
  for file in *.txt; do
    printf 'Found file %q with the following contents:\n' "$file"
    cat "$file"
  done
  rm -rf "$tempdir"
)

答案 1 :(得分:1)

不要让它变得更复杂。

cat "$FILE"

这就是你所需要的一切。注意变量周围的引号。它们阻止变量在空白处展开和拆分。你应该总是写那样的shell程序。总是在所有变量周围加上引号,除非你真的希望shell扩展它们。

for i in $pattern; do

那没关系。