首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BASH - If else、正则表达式、OR

BASH - If else、正则表达式、OR
EN

Stack Overflow用户
提问于 2012-10-14 02:54:52
回答 3查看 3.8K关注 0票数 4

我的bash脚本应该检查用户是否输入了两个数字。每个数字前面都应该有一个+-符号。第一个数字应为四位数,第二个数字应为五位数。

无论我输入什么值,输出都是Fail

运行脚本的命令行语句:

代码语言:javascript
复制
$me add +1234 -12345

脚本:

代码语言:javascript
复制
#!/bin/bash
#Script name add
if [ $1 != [\+\-][0-9][0-9][0-9][0-9] ] || 
   [ $2 != [\+\-][0-9][0-9][0-9][0-9][0-9] ]
  then
    echo Fail
else    
    echo Success
fi
EN

回答 3

Stack Overflow用户

发布于 2012-10-14 20:41:54

POSIX风格的测试([)根本不执行模式匹配。!=运算符是字符串比较。ksh-style test ([[))使用==运算符执行与正则外壳模式的模式匹配,并使用=~执行ERE匹配。(没有!=~,但我们可以DeMorganify)

代码语言:javascript
复制
! [[ $1 =~ [-+][[:digit:]]{4} && $2 =~ [-+][[:digit:]]{5} ]]

要在POSIX sh中执行模式匹配,惟一的选项是case语句。

票数 3
EN

Stack Overflow用户

发布于 2012-10-14 03:10:00

我不认为有一种方法(我错了,there is a way)可以使用if语句进行模式匹配。case可以用来做这些事情。工作示例:

代码语言:javascript
复制
#!/bin/bash

#Script name add

case $1 in
    [+-][0-9][0-9][0-9][0-9]) r1='success' ;;
    *) r1='fail' ;;
esac
case $2 in
    [+-][0-9][0-9][0-9][0-9][0-9]) r2='success' ;;
    *) r2='fail' ;;
esac

if [ $r1 = 'fail' ] || [ $r2 = 'fail' ]
then
    echo Fail
else
    echo Success
fi
票数 1
EN

Stack Overflow用户

发布于 2012-10-14 03:45:56

您需要使用双括号来启用与传统编程语言更相似的高级功能。例如,使用||而不是-o&&而不是-a。要执行模式(匹配),还需要使用双括号。

此外,括号应该用于整个表达式,而不是单独用于每个子表达式,并且应该包括||

我会使用下面这样的一句话:

代码语言:javascript
复制
if [[ $1 == [+-][0-9][0-9][0-9][0-9] && 
      $2 == [+-][0-9][0-9][0-9][0-9][0-9] ]]
  then
    echo "success"
else
    echo "fail"
fi

编辑:使用==而不是!= (为什么如此消极?)并删除对正则表达式的引用(使用模式匹配)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12875977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档