我的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发布于 2012-10-14 20:41:54
POSIX风格的测试([)根本不执行模式匹配。!=运算符是字符串比较。ksh-style test ([[))使用==运算符执行与正则外壳模式的模式匹配,并使用=~执行ERE匹配。(没有!=~,但我们可以DeMorganify)
! [[ $1 =~ [-+][[:digit:]]{4} && $2 =~ [-+][[:digit:]]{5} ]]要在POSIX sh中执行模式匹配,惟一的选项是case语句。
发布于 2012-10-14 03:10:00
我不认为有一种方法(我错了,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发布于 2012-10-14 03:45:56
您需要使用双括号来启用与传统编程语言更相似的高级功能。例如,使用||而不是-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编辑:使用==而不是!= (为什么如此消极?)并删除对正则表达式的引用(使用模式匹配)。
https://stackoverflow.com/questions/12875977
复制相似问题