我想将变量(这里称为var)的内容复制到文件中。
文件名存储在另一个变量destfile中。
我在执行此操作时遇到问题。 这是我尝试过的:
cp $var $destfile
我还用dd命令尝试了相同的操作...显然,shell认为$var是指目录,因此告诉我找不到该目录。
我该如何解决?
请通过发布一些格式正确的代码来改善您的问题,这些代码应显示您如何填充变量以及所有相关错误消息的显示形式。
"将变量的内容复制到目录"是什么意思? $var是否指定文件名或应写入文件的某些文本? 如果指定文本,那么您要向其中写入此内容的文件的名称是什么?
$ var包含我要复制的文本,应该将其写入的文件是用户定义的,因此,我首先使用变量的原因。
也许$destdir应该被命名为$destfile,所以它不会引起误解...名称$destdir建议它指定目录而不是文件。 这将使您的整个问题变得直截了当且易于理解。
使用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命令用于将文件复制(到文件),而不用于将文本写入文件。
需要更多的引号-现在,将变量值内的任何空白运行都转换为单个空格,将扩展glob表达式,依此类推。
谢谢,@ CharlesDuffy我总是忽略引号,尤其是。用于文件名中的空格
另一件事-在右引号和"$destdir"]中的]之间需要一个空格。
echo还将尾随换行符添加到变量中。
如果$var是-e text to append,这将失败,并且实际上不会写入-e
抱歉,我的意思是-e
我确实使用过echo命令,但是它从变量中包含的字符串中去除了换行符。因此,这在某些情况下不起作用。
因为echo $var依赖于shell来扩展变量,所以它对于空白和特殊字符等内容并不太有用。您可以改用perl -e print($ENV{var}),它将精确输出变量的值。
echo的问题是,如果var包含类似-e的内容,它将被解释为标志。另一个选项是printf,但是printf"$var">"$destdir"将扩展变量中的所有转义字符,因此,如果变量包含反斜杠,则文件内容将不匹配。但是,由于printf仅将反斜杠解释为格式字符串中的转义符,因此可以使用%s格式说明符将确切的变量内容存储到目标文件中:
printf"%s""$var">"$destdir"
如果变量字符串中有换行符(例如,三重引号或heredoc),则printf也很好。 echo不能很好地处理换行符。
@beeflobill您能解释一下" echo如何不能很好地处理换行符"。我所看到的唯一一件事就是echo添加了换行符。这确实使echo"$var"> destfile错误。
@SensorSmith在我的实验中,我看到当字符串具有" n"时,该回显将打印换行符。但是,如果字符串具有实际的换行符,则echo不会将其打印出来。我不知道为什么。
基本上是可移植性(和可靠性)问题。 unix.stackexchange.com/a/65819…或对于我们当中的致命人员:printf更好,请继续。
如果您的变数,上述答案均无效:
以-e开头
以-n开头
以-e开头
包含\,后跟n
不应在其后附加多余的换行符
因此,不能依靠它们获取任意字符串内容。
在bash中,您可以将" here字符串"用作:
cat <<"$destdir"
据我所知,cat总是在文件末尾插入换行符,而不管变量末尾没有换行符(尽管在大多数情况下这是一件好事)。使用printf的答案似乎是避免插入尾随换行符。
如果我没看错,您想将$var复制到文件中(如果是字符串)。
echo $var > $destdir
这是怎么做的。使用cp命令将使Shell将第一个参数解释为文件或目录的名称。
如果不将$var括在引号中,则在某些情况下文件的内容与$ vars内容不是100%相等。例如,当"回显"包含RSA密钥的var时,您在文件中得到无效的密钥。
如果$var包含空格或-e,则失败
当您说"复制变量的内容"时,该变量包含文件名,还是包含文件名?
我通过您的问题假设$var包含要复制到文件中的内容:
$echo"$var">"$destdir"
这会将$ var的值回显到名为$ destdir的文件中。注意引号。将" $ var"括在引号中非常重要。如果名称中有空格,也用于" $ destdir"。追加:
$echo"$var">>"$destdir"
如果var包含-e,则失败