外壳脚本中文件名中的空格



我有一个处理一些文件的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替换。谢谢。

不要试图将转义字符放入数据中 - 它们仅被视为语法(也就是说,在源代码中找到反斜杠时具有意义,而不是数据)。

也就是说,以下内容完美地工作,完全按照给定的方式:

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

。同样,如果名称来自 glob 结果或类似结果:

# 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"
)

不要让它比现在更复杂。

cat "$FILE"

这就是您所需要的。请注意变量两边的引号。它们可防止变量在空格处展开和拆分。你应该总是这样编写你的shell程序。始终在所有变量周围加上引号,除非您真的希望 shell 扩展它们。

for i in $pattern; do

那就没关系。

相关内容

  • 没有找到相关文章

最新更新