首页 > 解决方案 > 如果 `if [ ]` 中存在语法问题,如何使脚本提前退出?

问题描述

这将导致脚本按预期停止,因为grep a b返回非零退出代码并且-e设置了选项:

#!/bin/bash
set -e
grep a b
echo "hi"
$ ./test.sh
grep: b: No such file or directory

但是,即使存在语法错误,这也不会:

#!/bin/bash

set -e

if [ $a = 'a' ]; then
  echo "true"
else
  echo "false"
fi

echo "hi"
$ ./test.sh
./test.sh: line 5: [: a: binary operator expected
false
hi

如果传递给的语法有问题,有没有办法停止脚本if [ ]

标签: bash

解决方案


如果内部存在语法问题,如何使脚本提前退出if [ ]

你实现了这样的功能。令人高兴的是,它是可检测的——test或者当表达式为真时[退出,当表达式为假时,但当参数无法解析时返回不同的退出状态。请参阅posix test EXIT STATUS以供参考。01test

if [ invalid; then
    echo ok
else
   ret=$?
   if ((ret == 1)); then
       echo "It was false"
   else
       echo "Och nuuu - invalid" 
       exit
   fi
fi
   

或者您可以编写自己的函数包装器:

# Fun fact: yes `[` is allowed in function names.
# Many other characters are allowed too.
safe[() {
  local ret
  ret=0
  [ "$@" || ret=$?
  if ((ret == 0 || ret == 1)); then
       return "$ret"
  else
       exit 1
  fi
}
if safe[ some expression to check ]; then
     echo 'it is true!'
else
     echo 'it is false!'
fi

推荐阅读