Bash表达式与命令的返回代码相结合

时间:2015-01-28 23:17:33

标签: bash

我想测试一个条件,如果是,则运行命令,如果非零,则执行if的主体。

我已经尝试了[]和-a以及&&的各种组合方式。和$()并不能弄明白。下面的尝试给出错误:[: too many arguments

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

numMd5Files=1

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

1 个答案:

答案 0 :(得分:2)

您可能需要:

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失败感兴趣,那么md5sum的退出状态可以使用Bash内置!命令反转:

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

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

通常有一个外部命令/bin/test又称/bin/[ - 但是大多数现代shell还有一个内置的test[变体,它们优先执行外部命令。

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

[[运算符仅作为shell的内置函数提供。

我仍然拥有外部命令not的代码(1991年的第一个版本),我以前习惯使用它,并且可以安装一个名为!的链接,以便没有shell一个内置的!命令,我仍然可以反转命令的退出条件。它不是很复杂!