我想将变量(此处称为
var
)的内容复制到文件中。
文件名存储在另一个变量
destfile
中。
我在执行此操作时遇到问题。这是我尝试过的:
cp $var $destfile
我也用 dd 命令尝试过同样的事情...显然 shell 认为
$var
指的是一个目录,所以告诉我找不到该目录。
我该如何解决这个问题?
使用
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
命令用于复制文件(到文件),而不是用于将文本写入文件。
echo
的问题是,如果 var
包含类似 -e
的内容,它将被解释为标志。另一个选项是 printf
,但是 printf "$var" > "$destdir"
会展开变量中的任何转义字符,因此如果变量包含反斜杠,文件内容将不匹配。但是,由于 printf
仅将反斜杠解释为格式字符串中的转义符,因此您可以使用 %s
格式说明符将确切的变量内容存储到目标文件中:
printf "%s" "$var" > "$destdir"
如果您的变量:
,以上答案都不起作用-e
-n
-E
\
,后跟 n
因此不能依赖它们来获取任意字符串内容。
在 bash 中,您可以使用“此处字符串”:
cat <<< "$var" > "$destdir"
正如下面 Ash 的评论中所指出的,@Trebawa 的答案(与我在同一房间制定!)使用
printf
是比 cat
更好的方法。
上述所有工作都有效,但还必须解决一个原本不需要发生的问题(转义符和特殊字符):当 shell 扩展变量时出现特殊字符。只是一开始就不要这样做(变量扩展)。直接使用变量,无需扩展。
此外,如果您的变量包含秘密,并且您想要将该秘密复制到文件中,您可能不希望在命令行中进行扩展,因为 shell 命令的跟踪/命令回显可能会泄露秘密。这意味着,在命令行中使用
$var
的所有答案都可能因将变量内容暴露给 shell 的跟踪和日志记录而存在潜在的安全风险。
对于已导出的变量,请使用以下命令:
printenv var >file
这意味着,如果是OP问题:
printenv var >"$destfile"
注意:变量名称区分大小写。
警告:仅仅为了使用 printenv 打印变量而导出变量并不是一个好主意。如果您有一个包含秘密的未导出脚本变量,导出它会将其暴露给所有未来的子进程(除非未导出,例如使用
export -n
)。
如果我理解正确,你想将
$var
复制到文件中(如果它是字符串)。
echo $var > $destdir
当你说“复制变量的内容”时,该变量是包含文件名,还是包含文件名?
根据您的问题,我假设
$var
包含您想要复制到文件中的 contents:
$ echo "$var" > "$destdir"
这会将 $var 的值回显到名为 $destdir 的文件中。请注意引号。将“$var”括在引号中非常重要。如果名称中有空格,也适用于“$destdir”。附加它:
$ echo "$var" >> "$destdir"
您可能需要在构建过程中编辑conf文件:
echo "db-url-host=$POSTGRESQL_HOST" >> my-service.conf
您可以在之前运行来测试此解决方案
export POSTGRESQL_HOST="localhost"
稍微偏离 Eric 的答案,我们可以使用 POSIX here-documents 以一种通用兼容的方式来打印变量的内容,而无需在命令行中扩展它:
cat <<EOF >/path/to/file
$variable
EOF
“变量”的内容可以是我知道的任何内容(甚至是“EOF”),它将正确输出。后面会有一个换行符。