131

我想将变量(此处称为var)的内容复制到文件中。

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

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

cp $var $destfile

我也用 dd 命令尝试过同样的事情......显然,shell 认为它$var指的是一个目录,所以告诉我找不到该目录。

我该如何解决这个问题?

4

6 回答 6

180

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

于 2012-07-23T19:12:24.137 回答
64

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

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

于 2018-03-21T23:56:18.467 回答
43

如果您的变量,上述答案均无效:

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

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

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

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

正如下面 Ash 的评论中所指出的,@Trebawa 的答案(与我在同一个房间里制定!) usingprintf是比cat.

于 2018-03-21T23:40:59.183 回答
12

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

此外,如果您的变量包含一个秘密并且您想将该秘密复制到一个文件中,您可能不希望在命令行中进行扩展,因为 shell 命令的跟踪/命令回显可能会泄露秘密。意味着,$var命令行中使用的所有答案都可能通过将变量内容暴露给 shell 的跟踪和日志记录而存在潜在的安全风险。

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

printenv var >file

这意味着,在 OP 问题的情况下:

printenv var >"$destfile"

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

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

于 2020-05-01T15:43:38.723 回答
8

如果我理解正确,您想复制$var一个文件(如果它是一个字符串)。

echo $var > $destdir
于 2012-07-23T19:20:36.810 回答
0

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

我假设您的问题$var包含您要复制到文件中的内容:

$ echo "$var" > "$destdir"

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

$ echo "$var" >> "$destdir"
于 2012-07-23T19:28:13.903 回答