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)
鉴于存储在 中的两个脚本~/tmp,mytest
#!/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 happyend将happyend正常传递到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)
不会工作。
要从命令中获取返回(退出)代码,您需要将$?值保存到一个名为 的变量中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)