4

我的 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
4

3 回答 3

3

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

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

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

于 2012-10-14T12:41:53.960 回答
1

我认为没有办法(我错了,有办法)使用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
于 2012-10-13T19:10:00.207 回答
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

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

于 2012-10-13T19:45:55.623 回答