Linux Shell-将变量内容写入文件

Linux Shell-将变量内容写入文件,linux,bash,shell,Linux,Bash,Shell,我想将变量(这里称为var)的内容复制到一个文件中 文件名存储在另一个变量destfile中 我做这件事有困难。以下是我尝试过的: cp $var $destfile 我也用dd命令做了同样的尝试。。。显然,shell认为$var是指一个目录,因此告诉我找不到该目录 如何解决此问题?使用echo命令: var="text to append"; destdir=/some/directory/path/filename if [ -f "$destdir" ] then echo

我想将变量(这里称为
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
命令用于复制文件(到文件),而不是将文本写入文件。

如果我没听错,您希望在文件(如果是字符串)中复制
$var

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

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

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

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

如果变量:

  • -e
  • -n
  • -E
  • 包含一个
    \
    后跟一个
    n
  • 不应在其后面附加额外的换行符
因此,它们不能用于任意字符串内容

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


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


printf“%s”$var“>“$destdir”

上述所有工作,但也必须解决一个不需要首先出现的问题(转义和特殊字符):由shell展开变量时的特殊字符。首先不要这样做(变量展开)。直接使用变量,无需展开

此外,如果您的变量包含一个秘密,并且您希望将该秘密复制到文件中,那么您可能不希望在命令行中进行扩展,因为shell命令的跟踪/命令回显可能会泄露该秘密。也就是说,所有在命令行中使用
$var
的答案都可能存在潜在的安全风险,因为它们将变量内容暴露在shell的跟踪和日志中

使用以下命令:

printenv var >file
这意味着,对于OP问题:

printenv var >"$destfile"

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

请发布一些代码,显示如何填充变量,以及所有相关错误消息,以改进您的问题。将变量内容复制到目录是什么意思?
$var
是否指定应写入文件的文件名或某些文本?如果它指定文本,那么,您要将此内容写入的文件的名称是什么?$var包含我要复制的文本,并且它应该写入的文件是用户定义的,因此我首先使用变量的原因。也许
$destdir
应该命名为
$destfile
,这样不会产生误导。。。名称
$destdir
表明它指定的是目录而不是文件。这会让你的整个问题变得简单易懂,这就是为什么。使用
cp
命令将使shell将第一个参数解释为文件或目录的名称。如果未将
$var
括在引号中,则在某些情况下,文件的内容与$var的内容不是100%相等。例如,当“回显”包含RSA密钥的变量时,文件中的密钥无效。如果
$var
包含空格或
-e
需要更多引号,则会失败。此时,变量值中的任何空格都将转换为单个空格,全局表达式将展开,等等。还有一件事——在
“$destdir”]
echo
中的结束引号和
]
之间需要一个空格。如果
$var
是要追加的
-e文本,则此操作将失败,实际上并没有编写
-e
,因为
echo$var
依赖于shell来扩展变量,所以它在处理空格和特殊字符时不起作用。您可以使用
perl-e'print($ENV{var})
,它将精确地输出变量的值。如果
var
包含
-e
将双连字符作为第一个参数传递给
echo
终止其选项列表,则会失败。@Eric:
echo--“$var”>“$destfile”
printf也适用于变量字符串中有换行符的情况,如来自三引号或herdoc的换行符。echo不能很好地处理换行符。@beeflobill你能解释一下“echo不能很好地处理换行符”吗。我唯一看到的是echo添加了一个新行。这确实使
echo“$var”>destfile
出错。@在我的实验中,我发现当字符串有“\n”时,echo将打印一个换行符。但是,如果stri
printenv var >file
printenv var >"$destfile"