我的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
答案 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
编辑:使用==
代替!=
(为什么会这么消极?)并删除对正则表达式的引用(使用模式匹配)。