如何在 bash 脚本中将一些内容添加到文件名包含空格的文件中?

How can I add some content to a file whose filename contains space in bash script?

提问人:timewalker 提问时间:3/16/2023 更新时间:3/16/2023 访问量:70

问:

我的代码喜欢

target_file="target/middle dir/filename"
echo -e "Something New\n$(cat $target_file)" > "$target_file"

它失败了,并出现错误:

cat target/middle: Is a directory
cat : No such file or directory

cat 无法处理包含空格的文件路径。

我尝试了以下内容:

echo -e "Something New\n$(cat \"$target_file\")" > "$target_file"

没有运气。

和解决方案?

bash 文件 空间

评论

2赞 Jetchisel 3/16/2023
只需双引号即可将所有变量加起来,例如,而不是双引号不仅仅是句法糖,它对 shell 脚本至关重要......在您的例子中,如果其中有一个变量,则命令替换会引入一组新的引号。放置一个有效的 shebang 并将您的脚本粘贴到 shellcheck.net 进行验证/推荐。"$target_file"$target_file$(...)
1赞 user1934428 3/16/2023
仅供参考:在您尝试过的版本中,您使情况变得更糟:“\”实际上将字面引号传递给 ,同时仍然拆分为两个单词。 因此,查找两个文件,一个名为 ,另一个名为 。如果因为频繁需要引用而觉得 bash 规则(参数扩容先于分词)不方便,可以考虑切换到 zsh,因为 zsh 有“扩词后扩词”的策略。cat$target_filecat"target/middledir/filename"

答:

0赞 Master Yoda 3/16/2023 #1

最接近您的解决方案的是:

echo -e "Something New\n$(cat "$target_file")" > "$target_file"

然而,对我来说,这个看起来更好:

echo -e "Something New\n`cat "$target_file"`" > "$target_file"

也可以使用 sed(以避免在命令中调用 command):

sed -i '1iSomething New' "$target_file"
1赞 M. Nejat Aydin 3/16/2023 #2

除了报价问题外,在一个命令中读取和写入同一文件也可能会引发问题。以下是编写脚本的一种方法:

target_file="target/middle dir/filename"
{ echo "Something New"; cat "$target_file"; } > "$target_file".temp~ &&
        mv "$target_file".temp~ "$target_file"

另外,您不应该使用 ;它不是可移植的,对于您的情况,如果文件内容包含反斜杠字符(将尝试解释它们),则可能会出现问题。echo -e-e