如何在bash脚本中组合AND和OR条件用于if条件?
发布时间:2020-12-15 22:20:10 所属栏目:安全 来源:网络整理
导读:我试图结合逻辑AND或者在if条件下的bash脚本中.不知何故,我没有得到所需的输出,很难排除故障. 我试图验证传递给 shell脚本的输入参数没有参数,并且传递的第一个参数是否有效. if [ "$#" -ne 1 ] ([ "$1" == "ABC" ] || [ "$1" == "DEF" ] || [ "$1" == "GHI"
我试图结合逻辑AND&或者在if条件下的bash脚本中.不知何故,我没有得到所需的输出,很难排除故障.
我试图验证传递给 shell脚本的输入参数没有参数,并且传递的第一个参数是否有效. if [ "$#" -ne 1 ] && ([ "$1" == "ABC" ] || [ "$1" == "DEF" ] || [ "$1" == "GHI" ] || [ "$1" == "JKL" ]) then echo "Usage: ./myscript.sh [ABC | DEF | GHI | JKL]" exit 1 fi 谁能指出这里出了什么问题? 解决方法
你的陈述的直接问题是逻辑:你可能想写:
if [ "$#" -ne 1 ] || ! ([ "$1" = "ABC" ] || [ "$1" = "DEF" ] || [ "$1" = "GHI" ] || [ "$1" = "JKL" ]) then echo "Usage: ./myscript.sh [ABC | DEF | GHI | JKL]" >&2 exit 1 fi 即:中止,如果给出多于1个参数,或者如果给定的单个参数不等于可接受的值之一. 注意!否定括号中的表达式以及使用符合POSIX的形式的字符串相等运算符=(而不是==). 但是,鉴于你正在使用Bash,你可以使用单个[[…]]条件和Bash的正则表达式匹配运算符,=?: if [[ $# -ne 1 || ! $1 =~ ^(ABC|DEF|GHI|JKL)$]] then echo "Usage: ./myscript.sh [ABC | DEF | GHI | JKL]" >&2 exit 1 fi 如果不需要POSIX,则[[…]]优于[…] a variety of reasons. 注意,上面使用的=?在Bash 3.2中有效,而anubhava’s helpful answer中使用的隐式extglob语法需要Bash 4.1;但是,在早期版本中,您可以显式启用(并恢复到其原始值之后)extglob shell选项:shopt -s textglob. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |