【发布时间】:2021-09-12 00:04:53
【问题描述】:
我正在尝试在 bash 中创建一个函数来自动化 sftp。比如:
sftp host:dir <<EOF
put afile.txt
exit
EOF
问题是我需要最后一部分作为变量。所以像:
file="<<EOF
put afile.txt
exit
EOF"
所以我可以像这样使用它
stfp host:dir $file
这显然行不通。我有两个我不知道要解决的问题: 将变量 $file 放在一行中并将变量添加到命令中。
任何帮助将不胜感激
PS:抱歉我挑剔了。我已经尝试了echo -n $var | stfp 和sftp -b script_file 的选项。但我正在寻找可以在最新位置进行论证并且可以写在一行中的东西。
【问题讨论】:
-
变量扩展不会被解析为语法,因此是否可以将
<<EOF放入变量中并不重要——即使您这样做,它对shell,这意味着如果它被解析为源代码。 -
把数据放到一个文件里;从文件重定向标准输入(确保文件在之后被清理,如果出现任何问题)。 here-document 基本上就是这样做的——将 here-document 中的材料放入一个文件中,作为流程的标准输入。
-
herestring 确实是最明智的方法——将仅文字数据,而不是周围的语法放在变量中;然后使用
<<<"$that_variable"。 -
...将
<<EOF放在变量中不起作用的原因与将引号放在变量中的方式相同,无法使运行该变量与运行包含相同的代码的代码相同引号作为语法——BashFAQ #50 中详细讨论的限制。 -
echo -n $var有自己的错误;您需要引用以使其正常工作(echo -n "$var"可以工作,但最好不要使用-n;但是从全局来看,当您省略引号时,echo -n $var会丢弃换行符,扩展 glob,并且确实其他你不想要的东西)
标签: linux bash shell sftp heredoc