korn shell 脚本中的条件正则表达式模式匹配

korn shell 脚本中的条件正则表达式模式匹配

我已经开始使用 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

  1. 您的 grep 未设置为静默 grep。如果有匹配,就会输出,但你不希望这样。因此添加-q选项来抑制grep匹配的输出。
  2. +是扩展正则表达式 (ERE) 的一部分。要激活它们,您需要-Egrep 标志。否则+被视为文字字符,这就是为什么4050与您最初的尝试不匹配。
  3. 的语法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

相关内容