bash - 如果 `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 [ ]
?
解决方案
如果内部存在语法问题,如何使脚本提前退出
if [ ]
?
你实现了这样的功能。令人高兴的是,它是可检测的——test
或者当表达式为真时[
退出,当表达式为假时,但当参数无法解析时返回不同的退出状态。请参阅posix test EXIT STATUS以供参考。0
1
test
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
推荐阅读
- android - 在 android 模拟器中运行用颤振制作的应用程序的问题。问题 - com.jcraft.jsch.JSchException
- r - 在 R 编程中使用模式和表达式从文本文件中提取多个数据帧
- node.js - Docker 或 nodemon:重新加载问题
- google-sheets - 旨在检查另一列的 Google 表格公式不会给出错误但不起作用
- netsuite - 无法使用 setCurrentSublistValue 更改子列表字段
- javascript - 如何将 vue-i18n 的 $t 函数注入 cy 对象(cypress 全局对象)
- reactjs - 如何获取下拉 React 的特定 ID?
- r - 多个人和多层次的变化点分析
- powershell - 在 PowerShell 中检查 Cosmos DB 帐户的状态
- react-native - React Native 图像裁剪选择器找不到合适的图像 URL 加载器 (null)