Bash 表达式结合命令中的 return 代码

Bash expression combined with return code from a command

我想测试一个条件,如果为真 运行 一个命令,如果不为零,则执行 if.

的主体

我已经尝试了 [] 和 -a 以及 && 和 $() 的所有组合方式,但无法弄清楚。下面的尝试给出了错误:[: too many arguments

(这只是一个简化的例子,问题也是关于更多地了解bash而不是解决特定问题。)

numMd5Files=1

if [ ${numMd5Files} -eq 1 ] -a [ ! $( md5sum -c md5.txt ) ] ; then
    echo "md5 error"
fi

您可能需要:

if [ ${numMd5Files} -eq 1 ] && md5sum -c md5.txt; then

文件数必须为 1 且 md5sum 命令必须成功才能执行 then 块。您可能最终将 md5sum 的输出重定向到 /dev/null,因此您看不到它说的是什么:

if [ ${numMd5Files} -eq 1 ] && md5sum -c md5.txt >/dev/null 2>&1; then

如果您只对 md5sum 失败感兴趣,那么可以使用 Bash 内置 ! 命令反转 md5sum 的退出状态:

if [ ${numMd5Files} -eq 1 ] && ! md5sum -c md5.txt; then

if命令只是测试命令的退出状态。当您使用 [ 时,将执行 [ 命令并产生零或非零退出状态。如果退出状态为0,则成功,执行then子句。如果退出状态不为 0,则失败,并改为执行 elifelse 子句(如果存在)。

通常有一个外部命令 /bin/test 又名 /bin/[ — 但大多数现代 shell 也有 test 和 [=21= 的内置变体] 优先于外部命令执行。

&&运算符,执行左边的命令;如果成功,则执行右边的命令,如果也成功,则执行then子句。

[[ 运算符仅可用作 shell 的内置运算符。

我还有一个外部命令的代码 not(1991 年的第一个版本),我以前有时会用到,可以用一个名为 ! 的 link 安装,因此对于没有内置 ! 命令的 shells,我仍然可以反转命令的退出条件。不是很复杂!