我有一个处理一些文件的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
那就没关系。