私は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
- 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