Shell - 将变量内容写入文件

问题描述 投票:0回答:8

我想将变量(此处称为

var
)的内容复制到文件中。

文件名存储在另一个变量

destfile
中。

我在执行此操作时遇到问题。这是我尝试过的:

cp $var $destfile

我也用 dd 命令尝试过同样的事情...显然 shell 认为

$var
指的是一个目录,所以告诉我找不到该目录。

我该如何解决这个问题?

linux bash shell
8个回答
209
投票

使用

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
命令用于复制文件(到文件),而不是用于将文本写入文件。


84
投票

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

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


57
投票

如果您的变量:

,以上答案都不起作用
  • -e
  • 开头
  • -n
  • 开头
  • -E
  • 开头
  • 包含
    \
    ,后跟
    n
  • 后面不应附加额外的换行符

因此不能依赖它们来获取任意字符串内容。

在 bash 中,您可以使用“此处字符串”:

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

正如下面 Ash 的评论中所指出的,@Trebawa 的答案(与我在同一房间制定!)使用

printf
是比
cat
更好的方法。


30
投票

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

此外,如果您的变量包含秘密,并且您想要将该秘密复制到文件中,您可能不希望在命令行中进行扩展,因为 shell 命令的跟踪/命令回显可能会泄露秘密。这意味着,在命令行中使用

$var
的所有答案都可能因将变量内容暴露给 shell 的跟踪和日志记录而存在潜在的安全风险。

对于已导出的变量,请使用以下命令:

printenv var >file

这意味着,如果是OP问题:

printenv var >"$destfile"

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

警告:仅仅为了使用 printenv 打印变量而导出变量并不是一个好主意。如果您有一个包含秘密的未导出脚本变量,导出它会将其暴露给所有未来的子进程(除非未导出,例如使用

export -n
)。


8
投票

如果我理解正确,你想将

$var
复制到文件中(如果它是字符串)。

echo $var > $destdir

0
投票

当你说“复制变量的内容”时,该变量是包含文件名,还是包含文件名?

根据您的问题,我假设

$var
包含您想要复制到文件中的 contents

$ echo "$var" > "$destdir"

这会将 $var 的值回显到名为 $destdir 的文件中。请注意引号。将“$var”括在引号中非常重要。如果名称中有空格,也适用于“$destdir”。附加它:

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

0
投票

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

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

您可以在之前运行来测试此解决方案

export POSTGRESQL_HOST="localhost"


0
投票

稍微偏离 Eric 的答案,我们可以使用 POSIX here-documents 以一种通用兼容的方式来打印变量的内容,而无需在命令行中扩展它:

cat <<EOF >/path/to/file
$variable
EOF

“变量”的内容可以是我知道的任何内容(甚至是“EOF”),它将正确输出。后面会有一个换行符。

© www.soinside.com 2019 - 2024. All rights reserved.