次のコードは、私が入力した数に関係なく「奇数」を印刷しますが、偶数を引数として指定した場合、なぜ「偶数」を印刷しないのですか?
if [[ 'echo "$1%2" | bc' =~ 0 ]]
then
echo "Even"
else
echo "Odd"
fi
答え1
正規表現を次のように0
組み合わせています。ひも echo "$1%2" | bc
。文字列にaが含まれていないため、分岐が0
実行else
されます。
数値が奇数か偶数かをテストするには、$1
算術テストを使用します。
if (( $1 % 2 == 0 )); then
echo even
else
echo odd
fi
この(( ... ))
ビットは算術評価です。内部式を評価し、その値はその式の結果になります。これにより、ステートメントはif
結果に対してアクションを実行できます。
bc
意図したとおりに使用してください。
if [ "$( printf '%s %% 2\n' "$1" | bc )" -eq 0 ]; then
echo even
else
echo odd
fi
すなわち、命令置換(bit $(...)
)を用いて命令を実行した結果を代入した後-eq
(算術比較のため)これを用いて0と比較する。
printf
使用するのが面白いと感じたら使用してください。
if [ "$( echo "$1 % 2" | bc )" -eq 0 ]; then
echo even
else
echo odd
fi
でも見てください」なぜprintfがechoより優れているのですか?」。
答え2
一重引用符は、$ 1が置き換えられるのを防ぎます。目的の結果を得るには、文の一部を引用してください。
答え3
よりシンプルで独立したソリューションを使用できますが、あなたの試みはほぼ正確です(bash
それも依存しているので、それを使用してください)。bc
'~のため`(バックティック):
if [[ `echo "$1%2" | bc` =~ 0 ]]
then
echo "Even"
else
echo "Odd"
fi
何を試しましたか?
'echo "$1%2" | bc'
はい、意味は:
`echo "$1%2" | bc`
一方、あなたは=~
:
「==」と「!=」と同じ優先順位を持つ追加の二項演算子「=~」を使用することもできます。使用されると、演算子の右側の文字列はPOSIX拡張正規表現として扱われ、それに応じて一致します(例:regex3)。
おそらく、いいえあなたが望むものは、しかし、この特定のケースではうまく動作します:自然数が何でn%2
あれn
、それはいつもあなたを0
与えるでしょう1
。1
(数字odd
)は正規表現と一致しないので安全です...しかし注:他の場合はこれが間違っている0
可能性があります。正規表現は、、、、または。この場合、代わりに使用する必要があります。0
0
10
707
2.71828182845905
0
=
=~
また、$(...)
バックティックよりも優れていることに注意してください。