命令的返回值未显示在脚本中

命令的返回值未显示在脚本中

如果我在命令行中执行以下 rsync 命令,我将获得正确的返回状态

/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"

echo $?
255

无法hostname访问,因此我得到的返回值为 255

这对我来说很好。但是如果我将相同的命令放入bash脚本中,那么我不会得到任何返回值

#!/bin/bash
datetime=`date +%Y.%m.%d`
ret_value= `/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"`
echo $ret_value

脚本的输出仅显示空白。未$ret_value打印。

我在这里缺少获取rsync通过脚本打印的命令的返回值。

答案1

尝试这个。

#!/bin/bash
datetime=`date +%Y.%m.%d`
ret_value=`/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"; echo $?`
echo $ret_value

问题是您正在运行的命令不会产生输出,因为您将其通过管道传输到文件。附加命令以回显最后一个命令退出代码应该会给出您正在寻找的结果。

答案2

线路

ret_value= `…`

有一个奇怪的行为。它首先执行反引号内的命令。然后该命令的输出被分割成单词,第一个单词用作要执行的命令。如果至少有一个单词,它将作为命令执行(其他单词作为参数),并且ret_value仅在该命令的持续时间内将环境变量设置为空字符串。但由于反引号中的命令输出恰好为空,因此该行是一个赋值:它将 shell 变量设置ret_value为空字符串。

你可能想写

ret_value=`…`

等号后没有空格。这将设置ret_value输出反引号中的命令 - 这就是反引号的含义。请记住,在 shell 中,空格很重要,特别是赋值中不能有空格。

如果您想获取命令的返回值,请运行该命令(其输出到您喜欢的任何地方),然后读取特殊变量的内容$?。该$?变量包含先前执行的命令的状态。

/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"
echo $?

您可能想要甚至需要保存$?到另一个变量中,因为一旦执行了另一个命令,它就会发生变化。

/usr/bin/rsync -azv -p /home/zaman x11server:/home/zamanr &> rsyncjob/output."$datetime"
ret_value=$?
if [ $ret_value -eq 0 ]; then
  echo "Success"
else
  echo "Failure, rsync return status $ret_value"
fi
exit $ret_value

相关内容