是否有一种很好的方法可以在bash中调用命令并且如果其返回代码在特定范围内/满足特定条件则失败?
我的用例:
我已经在Travis上设置了CI,并且想要添加一个yarn audit
检查到我的测试脚本的高或关键漏洞。当调用yarn审计时,返回的状态码是漏洞级别的位掩码,因此,例如,如果您有中等(4)和严重(16)级别,则返回20。如果至少有任何高警报,我想让脚本失败,所以如果status>= 8.
Travis的设置使得命令列表按顺序运行,当有非零状态码时中止,所以我猜基本上是set -e
设置。
我当前的尝试如下:
yarn audit || (mask=$? && [ $mask -lt 8 ])
这是可行的,但是有没有更好的&比这更整洁的方法?我的意思是,对我来说,如果状态码是>=8"例如,是否有一种方法可以避免$?
语法,当所有你需要做的是条件状态码一次?我正在考虑像[ $(yarn audit) -lt 8]
这样的单括号表达式,这显然不是我想要的,因为$(yarn audit)
返回命令的输出,而不是状态码,但只是为了得到我的目标。
如果我理解正确,脚本有set -e
设置,但如果yarn audit
的状态为8或更多,则仅想退出,对吗?如果是这样,您可以通过跳过mask
变量来稍微简化现有的内容:
yarn audit || [ $? -lt 8 ]
主要的缺点是您不能对yarn
的状态做任何其他事情,因为它会立即被[ ]
测试的状态所取代。(顺便说一句,如果你想保存它以后,你必须使用{ ;}
而不是( )
,以避免将该代码放在子shell中)。
现在,我倾向于不相信set -e
会做正确的事情,因为它关于何时退出的想法并不总是您所期望或想要的(参见BashFAQ #105:"为什么set -e
(或set -o errexit
,或trap ERR
)不做我所期望的?")。我更喜欢显式的exit
命令,像这样:
yarn audit || [ $? -lt 8 ] || {
echo "Audit failed" >&2
exit 1
}
或者,有点笨拙,但意图更清晰:
yarn audit || if [ $? -ge 8 ]; then
echo "Audit failed" >&2
exit 1
fi