Shell-将变量内容写入文件

我想把一个变量(这里称为 var)的内容复制到一个文件中。

文件名存储在另一个变量 destfile中。

我在这方面有问题,我试过这么做:

cp $var $destfile

我还用 dd 命令尝试了同样的方法... ... 显然 shell 认为 $var引用的是一个目录,因此告诉我无法找到该目录。

我该怎么办?

396248 次浏览

使用 echo命令:

var="text to append";
destdir=/some/directory/path/filename


if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi

if测试 $destdir代表一个文件。

>在截断文件后追加文本。如果您只想将 $var中的文本附加到现有的文件内容,那么改为使用 >>:

echo "$var" >> "$destdir"

cp命令用于复制文件(到文件) ,而不是用于将文本写入文件。

如果我没有理解错的话,您希望将 $var复制到一个文件中(如果它是一个字符串)。

echo $var > $destdir

当你说“拷贝一个变量的内容”时,这个变量是包含一个文件名,还是包含一个文件名?

根据你的问题,我假设 $var包含你想要复制到文件中的 内容:

$ echo "$var" > "$destdir"

这将把 $var 的值回显到一个名为 $destdir 的文件中。注意引号。把“ $var”放在引号中非常重要。如果名称中有空格,也用于“ $destdir”。附件:

$ echo "$var" >> "$destdir"

如果你的变量是:

  • -e开始
  • -n开始
  • -E开始
  • 包含一个 \后跟一个 n
  • 不应该在后面添加额外的换行符

因此它们不能用于任意的字符串内容。

在 bash 中,可以使用“ here string”作为:

cat <<< "$var" > "$destdir"

正如 Ash 在下面的评论中指出的那样,@ Trebawa 的回答(和我在同一个房间里制定的!)使用 printf是一种比 cat更好的方法。

echo有一个问题,如果 var包含类似于 -e的内容,它将被解释为一个标志。另一个选项是 printf,但是 printf "$var" > "$destdir"将展开变量中的任何转义字符,因此如果变量包含反斜杠,文件内容将不匹配。但是,由于 printf只将反斜杠解释为格式字符串中的转义,因此可以使用 %s格式说明符将确切的变量内容存储到目标文件:

printf "%s" "$var" > "$destdir"

所有上述工作,但也必须解决一个问题(转义和特殊字符) ,这个问题本来就不需要发生: 当变量由 shell 展开时,特殊字符。只是一开始不要这样做(变量展开)。直接使用变量,不需要展开。

另外,如果您的变量包含一个 secret,并且您希望将该 secret 复制到一个文件中,那么您可能不希望在命令行中进行展开,因为 shell 命令的跟踪/命令回显可能会揭示这个 secret。这意味着,在命令行中使用 $var的所有应答都可能存在潜在的安全风险,因为它将变量内容暴露给 shell 的跟踪和日志记录。

对于已经导出的变量,请使用:

printenv var >file

这意味着,对于 OP 问题:

printenv var >"$destfile"

注意: 变量名是区分大小写的。

警告: 仅仅为了用 printenv 打印而导出变量是不明智的。如果您有一个包含秘密的非导出脚本变量,导出它将向所有未来的子进程公开它(除非是未导出的,例如使用 export -n)。

您可能需要在构建过程中编辑 conf 文件:

echo "db-url-host=$POSTGRESQL_HOST" >> my-service.conf

可以在 export POSTGRESQL_HOST="localhost"之前运行以测试此解决方案