加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在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.
在这种情况下,$#和$1不需要引用,而且||可以在条件内使用.

注意,上面使用的=?在Bash 3.2中有效,而anubhava’s helpful answer中使用的隐式extglob语法需要Bash 4.1;但是,在早期版本中,您可以显式启用(并恢复到其原始值之后)extglob shell选项:shopt -s textglob.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读