为什么会回显$?在此脚本中运行时会有所不同吗?

为什么会回显$?在此脚本中运行时会有所不同吗?

我的脚本中有以下内容:

connectionTest=$(sshpass -p "${pass}" ssh -q -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "${remoteUser}"@"${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; echo $?")

当我取出命令并在机器上手动运行它时,我得到了我期望的退出代码。但是,每当脚本运行时,生成的退出代码是总是0。

为什么退出代码总是返回 0?

答案1

您收到意外返回状态的原因是您为远程主机引用命令的方式。

考虑并对比这两种说法:

a=apple; ssh remotehost "a=banana; echo $a"
a=apple; ssh remotehost 'a=banana; echo $a'

在第一种情况下,"... $a"评估运行命令ssh,导致这种有效情况:

ssh remotehost "a=banana; echo apple"

在第二种情况下,'... $a'通过作为字面意思到远程主机执行,导致这种有效情况:

ssh remotehost 'a=banana; echo $a'

这正是您的$?.由于您已将其用双引号括起来,因此会在运行命令之前对其进行评估。它的零值来自您之前的命令,所以您是什么有效地跑步是这样的:

connectionTest=$(sshpass -p PASSWORD ssh ... "REMOTEUSER@REMOTEIP "echo quit | netcat ... ; echo 0")

您需要的是使用单引号让本地 shell 将其视为文字,如下所示:

connectionTest=$(sshpass -p "${pass}" ssh ... "${remoteUser}@${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; "'echo $?')

请注意,由两部分组成的字符串(例如)"hello"'world'连接成一个值helloworld。第一部分进行变量评估;第二部分则不然。

相关内容