我已经开始使用 korn shell 学习 Unix shell 脚本。请启发我发现我在为以下问题编写 ksh 代码时所犯的错误,如下所述:
我的脚本有两个参数。如果参数是数字,我必须对它们求和,否则按原样打印它们。我的代码如下:
#!/usr/bin/ksh
arg1=$1
arg2=$2
if echo $arg1 | grep '^[0-9]+$' && echo $arg2 | grep '^[0-9]+$'
then
echo ${expr $arg1 + $arg2}
else
echo $arg1 and $arg2
fi
我已经尝试了很多次以获得正确的输出,但一切都是徒劳的。它总是执行 else 条件。如果我运行脚本:
sh var_regex_match.sh 40 50
我得到的输出是:
40 and 50
如果我在发布问题时犯了任何错误,请原谅我。非常感谢您的帮助!
答案1
- 您的 grep 未设置为静默 grep。如果有匹配,就会输出,但你不希望这样。因此添加
-q
选项来抑制grep
匹配的输出。 +
是扩展正则表达式 (ERE) 的一部分。要激活它们,您需要-E
grep 标志。否则+
被视为文字字符,这就是为什么40
和50
与您最初的尝试不匹配。- 的语法
expr
是错误的。
纠正这些点,脚本将变为:
#!/usr/bin/ksh
arg1=$1
arg2=$2
if echo "$arg1" | grep -Eq '^[0-9]+$' && echo "$arg2" | grep -Eq '^[0-9]+$'
then
expr "$arg1" + "$arg2"
else
echo "$arg1 and $arg2"
fi
然而,这需要很多迂回并且expr
已被弃用。更直接的方法是
#!/usr/bin/ksh
arg1=$1
arg2=$2
case "$arg1$arg2" in
*[!0-9]*) echo "$arg1 and $arg2";;
*) echo "$((arg1+arg2))";;
esac
验证连接的和case
是否包含非数字。如果是,则它们会被回显并改变。否则,计算它们的总和。$arg1
$arg2