我想测试一个条件,如果是,则运行命令,如果非零,则执行if
的主体。
我已经尝试了[]和-a以及&&的各种组合方式。和$()并不能弄明白。下面的尝试给出错误:[: too many arguments
(这只是一个简化的例子,问题还在于更多地了解bash而不是解决特定问题。)
numMd5Files=1
if [ ${numMd5Files} -eq 1 ] -a [ ! $( md5sum -c md5.txt ) ] ; then
echo "md5 error"
fi
答案 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,则失败,而是执行elif
或else
子句(如果存在)。
通常有一个外部命令/bin/test
又称/bin/[
- 但是大多数现代shell还有一个内置的test
和[
变体,它们优先执行外部命令。
使用&&
运算符,执行左侧的命令;如果成功,则执行右侧的命令,如果成功,则执行then
子句。
[[
运算符仅作为shell的内置函数提供。
我仍然拥有外部命令not
的代码(1991年的第一个版本),我以前习惯使用它,并且可以安装一个名为!
的链接,以便没有shell一个内置的!
命令,我仍然可以反转命令的退出条件。它不是很复杂!