【问题标题】:How make multiple if conditions with regex in shell script如何在 shell 脚本中使用正则表达式创建多个 if 条件
【发布时间】:2020-01-09 11:50:18
【问题描述】:

我有 2 个值,项目和标签。我需要检查它们是否为空/null,以及项目是否只有字符('-' 除外)以及标签是否只有数字(期望 '.')。

用户实际上是颠倒了它们的顺序,首先是项目,然后是标签。

如果用户顺序错误,我会尝试反转 $project$tag 的正则表达式...但是什么也没有发生,没有错误并且代码继续。

if [ -z $project ] || 
   [ -z $tag ] || 
   [[ $project =~ '/^[0-9]+(\.[0-9]+)*$/' ]] || 
   [[ $tag =~ '/^[A-Za-z]+(\-[A-Za-z]+)*$/' ]] ; then
  echo Project or tag wrong, please try again. &&
  echo Example: file.sh project-test 1.99.2
fi

这段代码没有给我错误,但也没有做我需要的。我在这里做错了什么?

---- 更新答案

我的语法错误,现在可以正常使用(不带引号)。

if [[ $project =~ ^[0-9]+(\.[0-9]+)*$ ]] && 
   [[ $tag =~ ^[A-Za-z]+(\-[A-Za-z]+)*$ ]] ; then
  echo Correct
else
  echo Project or tag wrong, please try again. &&
  echo Example: file.sh project-test 1.99.2
fi

【问题讨论】:

    标签: regex shell if-statement scripting


    【解决方案1】:

    只有在一切正常时才让它通过
    grep -cP 使用 perl 兼容的正则表达式,并打印匹配的行数
    结合echo,计数仅限于0或1
    我对它们进行了操作,并将 4 个“非”条件替换为 2 个“是”条件

    #!/bin/bash
    function check_arg() {
    project=$1
    tag=$2
    if [ `echo $project|grep -cP '^[-a-zA-z]+$'`  -eq 1 ] &&
       [ `echo $tag|grep -cP '^[\.0-9]+$'`  -eq 1 ] ;
       then
       echo all good $project $tag
    else
        echo Example : file.sh project-test 1.99.2
    fi
    
    }
    
    check_arg project-test 99.2
    check_arg 1.99.2  project-test
    

    输出

    all good project-test 99.2
    Example : file.sh project-test 1.99.2
    
    
    

    【讨论】:

    • 我尝试得到错误[: -eq: unary operator expected
    • 错误告诉 [-eq 之间什么都没有出现,我应该用引号和计数来保护它。你能用你的exact code piece更新你的帖子吗?
    • 你把结尾的`放在了错误的地方,应该放在单引号之后,
    • 我试了一下,得到了同样的错误,但我也找到了另一种可以正常工作的方法,谢谢。
    • 祝你好运。引号很容易弄乱,而且修复方法不止一种
    猜你喜欢
    • 2018-01-02
    • 2016-06-25
    • 2013-05-10
    • 2010-12-10
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多