我想将变量(此处称为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 的答案(与我在同一个房间里制定!) usingprintf
是比cat
.
所有上述工作,但还必须解决一个不需要首先发生的问题(转义和特殊字符):当变量被 shell 扩展时的特殊字符。只是首先不要这样做(变量扩展)。直接使用变量,无需扩展。
此外,如果您的变量包含一个秘密并且您想将该秘密复制到一个文件中,您可能不希望在命令行中进行扩展,因为 shell 命令的跟踪/命令回显可能会泄露秘密。意味着,$var
命令行中使用的所有答案都可能通过将变量内容暴露给 shell 的跟踪和日志记录而存在潜在的安全风险。
对于已经导出的变量,使用这个:
printenv var >file
这意味着,在 OP 问题的情况下:
printenv var >"$destfile"
注意:变量名区分大小写。
警告:仅仅为了使用 printenv 打印而导出变量并不是一个好主意。如果您有一个包含机密的未导出脚本变量,则导出它会将其公开给所有未来的子进程(除非未导出,例如使用export -n
)。
如果我理解正确,您想复制$var
一个文件(如果它是一个字符串)。
echo $var > $destdir
当您说“复制变量的内容”时,该变量是否包含文件名,还是包含文件名?
我假设您的问题$var
包含您要复制到文件中的内容:
$ echo "$var" > "$destdir"
这会将 $var 的值回显到一个名为 $destdir 的文件中。注意引号。将“$var”括在引号中非常重要。如果名称中有空格,也适用于“$destdir”。要附加它:
$ echo "$var" >> "$destdir"