当我使用ssh在shell脚本中执行远程文件时,我可以在远程机器上执行结果,但是,遇到了无法识别用户定义变量的问题。
我像这样创建了一个shell脚本run.sh
#!/bin/bash
ssh jenkins@10.122.214.55 << EOF
./test.sh && ret=1 || ret=0
echo "before"
echo ${ret}
echo "after"
echo ${HOME}
exit ${ret}
EOF
run.sh:
调用的test.sh的内容#!/bin/bash
echo "lala"
exit 1
当我打电话给./run.sh 它像这样打印
lala
before
after
/home/jenkins
为什么它不回显${ret}
?调用./run.sh后,回显$?是0这是意外的,我认为它应该在这里回应1。
谢谢!
答案 0 :(得分:2)
因为heredoc中的变量在被发送到ssh的标准输入之前被本地脚本扩展。
换句话说,你的heredoc与
的行为相似#!/bin/bash
string="echo \"before\"
echo ${ret}
echo \"after\"
echo ${HOME}
exit ${ret}
./test.sh && ret=1 || ret=0"
echo "$string" | ssh jenkins@10.122.214.55
这使得字符串具有内插变量更为明显。
有几种解决方法:要么你可以转义$
符号(例如echo \${ret}
),以便传递预期的字符串,或者你可以使用逐字的heredoc
#!/bin/bash
ssh jenkins@10.122.214.55 <<'EOF'
./test.sh && ret=1 || ret=0
echo "before"
echo ${ret}
echo "after"
echo ${HOME}
exit ${ret}
EOF
通过单引号分隔符,我们确保在heredoc内部不会发生扩展。