我有一个包含内容的模板文件
数量:2
ssh ubuntu@ip << EOF
cat template|grep count|awk -F":" '{print $2}' > log
EOF
期望的输出是2
但正在打印count : 2
答案1
这里的文档<< EOF
创建了一个类似于"..."
变量扩展的引用上下文。那里有一个$2
in ,它是由本地 shell 扩展的。 (撇号不引用任何内容,因为它们位于较大的引用字符串(heredoc)内,因此它们不是特殊字符。您不能通过嵌套来“增加引用级别'...'
” "..."
)
您的本地 shell 可能没有参数$2
,因此它扩展为空字符串,而远程 shell 在 stdin 上接收到的内容是:
cat template|grep count|awk -F":" '{print }' > log
awkprint
是整行。
您可以通过向终止字符串添加撇号样式的引用来要求heredoc运算符不要扩展变量,如下所示:
ssh ... << 'EOF'
...
EOF
如果您对示例执行此操作,则该文件$2
将在heredoc处理中幸存并通过ssh传递到远程shell。
附加提示:cat | grep | awk
这是双重浪费,因为awk
可以做到这一切。您的远程命令相当于
awk -F":" '/count/ {print $2}' template > log