BASH - 如果是其他,正则表达式,或

时间:2012-10-13 18:54:52

标签: regex bash if-statement

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

无论我输入什么值,输出始终为Fail

运行脚本的命令行语句:

$me add +1234 -12345

剧本:

#!/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

3 个答案:

答案 0 :(得分:3)

POSIX样式测试([)根本不执行模式匹配。 !=运算符是字符串比较。 ksh样式测试([[))使用==运算符执行模式匹配与reglular shell模式,并与=~匹配ERE。 (没有!=~,但我们可以DeMorganify)

! [[ $1 =~ [-+][[:digit:]]{4} && $2 =~ [-+][[:digit:]]{5} ]]

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

答案 1 :(得分:1)

我认为没有办法(我错了,there is a way)使用if语句进行模式匹配。 case可以用于此类事情。工作示例:

#!/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

答案 2 :(得分:1)

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

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

我会使用类似的行:

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

编辑:使用==代替!=(为什么会这么消极?)并删除对正则表达式的引用(使用模式匹配)。