Korn シェルスクリプトの条件付き正規表現パターンの一致

Korn シェルスクリプトの条件付き正規表現パターンの一致

私はkornシェルを使ってUnixシェルスクリプトを学び始めました。以下の問題についてkshコードを書いている間に私が犯した間違いを見つけることができるように教えてください。

私のスクリプトには2つのパラメータがあります。引数が数値の場合は合計し、それ以外の場合はそのまま印刷する必要があります。私のコードは次のとおりです。

#!/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 フラグが必要です。それ以外の場合は+リテラル文字として扱われるため、初期試行40と一致しません。50
  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

関連情報