我想将变量(这里称为var
)的内容复制到文件中。
文件名存储在另一个变量中destfile
。
我在执行此操作时遇到问题。这是我尝试过的:
cp $var $destfile
我还用dd命令尝试了相同的操作...显然,shell认为这$var
是指目录,因此告诉我找不到该目录。
我该如何解决?
我想将变量(这里称为var
)的内容复制到文件中。
文件名存储在另一个变量中destfile
。
我在执行此操作时遇到问题。这是我尝试过的:
cp $var $destfile
我还用dd命令尝试了相同的操作...显然,shell认为这$var
是指目录,因此告诉我找不到该目录。
我该如何解决?
$var
指定文件名或应写入文件的某些文本?如果指定文本,那么您要向其写入此内容的文件的名称是什么?
$destdir
应该命名,$destfile
以免引起误解...该名称$destdir
表明它指定的是目录而不是文件。这将使您的整个问题变得直截了当且易于理解。
Answers:
使用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
命令用于复制文件(到文件),而不用于将文本写入文件。
]
in 之间留一个空格"$destdir"]
。
echo
还向变量添加尾随换行符。
$var
为-e text to append
,则会失败,并且实际上不会写成-e
echo $var
依赖于外壳程序来扩展变量,所以它对空白和特殊字符之类的东西并不是很有效。您可以改用perl -e 'print($ENV{var})'
它,它会精确输出变量的值。
echo
有一个问题,如果var
包含类似的东西-e
,它将被解释为一个标志。另一个选项是printf
,但printf "$var" > "$destdir"
会扩展变量中的所有转义字符,因此,如果变量包含反斜杠,则文件内容将不匹配。但是,由于printf
在格式字符串中仅将反斜杠解释为转义符,因此可以使用%s
格式说明符将确切的变量内容存储到目标文件中:
printf "%s" "$var" > "$destdir"
echo "$var" > destfile
错。
printf
更好,继续前进。
如果您的变数,上述答案均无效:
-e
-n
-E
\
后跟一个n
因此,不能依靠它们来获取任意字符串内容。
在bash中,您可以将“ here字符串”用作:
cat <<< "$var" > "$destdir"
如下面的评论所述,使用@Trebawa的答案(与我的房间相同!)printf
是一种更好的方法。
printf
在cat
是,前者是一个shell内置的,这将始终执行不是外部的二进制更快。
如果我理解正确,那么您想复制$var
到一个文件中(如果它是一个字符串)。
echo $var > $destdir
cp
命令将使Shell将第一个参数解释为文件或目录的名称。
$var
引号引起来,则在某些情况下文件的内容与$ var的内容不是100%相等。例如,当“回显”包含RSA密钥的var时,您在文件中得到无效的密钥。
$var
包含空格或-e
以上所有工作均有效,但还必须解决首先不需要发生的问题(转义符和特殊字符):外壳扩展变量时的特殊字符。只是首先不要做(可变扩展)。直接使用变量,无需扩展。
另外,如果您的变量包含机密,并且您想将该机密复制到文件中,则可能不希望在命令行中进行扩展,因为shell命令的跟踪/命令回显可能会泄露机密。就是说,$var
在命令行中使用的所有答案都可能通过将变量内容暴露给外壳的跟踪和日志记录而具有潜在的安全风险。
用这个:
printenv var >file
这就是说,在OP问题中:
printenv var >"$destfile"