从 shell 脚本中,执行另一个带参数的脚本并获取其返回码

nig*_*d3r 2 bash shell-script exit-status

在 i686 / 32 位双 CPU 上,使用全新的 Debian Stretch 安装,我安装了 Octave 4.2.1 并./mytest在为其提供执行权限后运行:

#!/bin/bash
./mytest.m
Run Code Online (Sandbox Code Playgroud)

哪里test.m

#!/usr/bin/octave
exit(0)
Run Code Online (Sandbox Code Playgroud)

鉴于存储在 中的两个脚本~/tmpmytest

#!/bin/bash

if $1/mytest.m "$2"; then
  echo "good"
else
  echo "bad"
fi
Run Code Online (Sandbox Code Playgroud)

mytest.m

#!/usr/bin/octave

param = argv(){1};

if strcmp(param, "happyend")
  exit(0)
else
  exit(1)
end
Run Code Online (Sandbox Code Playgroud)

运行tmp/mytest tmp happyendhappyend正常传递到mytest,随后传递到mytest.m,将信号 0 传递回mytest,将打印“好”。现在,如何从mytest.m变量中获取返回(退出)代码?(上例中的 0)。

直观的选择

#!/bin/bash

result=$("$1"/mytest.m "$2")

if [ $result = 0 ]; then
  echo "good"
else
  echo "bad"
fi
Run Code Online (Sandbox Code Playgroud)

不会工作。

Jef*_*ler 5

要从命令中获取返回(退出)代码,您需要将$?值保存到一个名为 的变量中result

"$1/mytest.m" "$2"
result=$?
if [ "$result" -eq 0 ]; then
  echo "good"
else
  echo "bad"
fi
Run Code Online (Sandbox Code Playgroud)

如果您只想将结果保存足够长的时间来测试它,请使用以下命令跳过result变量:

"$1/mytest.m" "$2"
if [ $? -eq 0 ]; then
  echo "good"
else
  echo "bad"
fi
Run Code Online (Sandbox Code Playgroud)

但请注意$?在运行 mytest.m 后立即进行测试,因为任何后续命令都会将返回码放入$?.

如果只想测试结果是否为零,则无需将其视为整数。只需将命令本身视为条件。

if "$1/mytest.m" "$2"; then
  echo "good"
else
  echo "bad"
fi
Run Code Online (Sandbox Code Playgroud)