【问题标题】:Bash variable including "<<EOF"Bash 变量包括“<<EOF”
【发布时间】: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 的选项。但我正在寻找可以在最新位置进行论证并且可以写在一行中的东西。

【问题讨论】:

  • 变量扩展不会被解析为语法,因此是否可以将&lt;&lt;EOF 放入变量中并不重要——即使您这样做,它对shell,这意味着如果它被解析为源代码。
  • 把数据放到一个文件里;从文件重定向标准输入(确保文件在之后被清理,如果出现任何问题)。 here-document 基本上就是这样做的——将 here-document 中的材料放入一个文件中,作为流程的标准输入。
  • herestring 确实是最明智的方法——将仅文字数据,而不是周围的语法放在变量中;然后使用&lt;&lt;&lt;"$that_variable"
  • ...将&lt;&lt;EOF 放在变量中不起作用的原因与将引号放在变量中的方式相同,无法使运行该变量与运行包含相同的代码的代码相同引号作为语法——BashFAQ #50 中详细讨论的限制。
  • echo -n $var 有自己的错误;您需要引用以使其正常工作(echo -n "$var" 可以工作,但最好不要使用 -n;但是从全局来看,当您省略引号时,echo -n $var 会丢弃换行符,扩展 glob,并且确实其他你不想要的东西)

标签: linux bash shell sftp heredoc


【解决方案1】:

此处未引用-文档插值。因此,

sftp host:dir <<EOF
put ${file@Q}
exit
EOF

我在$file 周围加上了引号,以捕捉文件名包含空格的情况。

更新:纳入 Léa Gris 的评论。 注意:@Q 语法在 bash 手册页中标题 Parameter transformation 下的描述:

扩展是一个字符串,它是以可重复用作输入的格式引用的参数值。

虽然这意味着引用是以 bash 可以重用输入的方式完成的,但 IMO 对 ftp 脚本中的语法也应该足够了。

【讨论】:

  • '$file' 将在文件名包含单引号时中断。使用 Bash 4+,您可以使用 ${file@Q} 扩展变量,如果需要,它将自动提供正确的引用。
  • @LeaGris:它会坏掉是我写的——但感谢您用@Q 指出这个想法。我不知道这一点,我会更新我的答案。
  • 别忘了去掉引号,因为它会和${file@Q}冲突
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2020-06-30
相关资源
最近更新 更多