if 問い合わせ形式に関する質問

if 問い合わせ形式に関する質問

次のコードは、私が入力した数に関係なく「奇数」を印刷しますが、偶数を引数として指定した場合、なぜ「偶数」を印刷しないのですか?

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与えるでしょう11(数字odd)は正規表現と一致しないので安全です...しかし注:他の場合はこれが間違っている0可能性があります。正規表現は、、、、または。この場合、代わりに使用する必要があります。00107072.718281828459050==~

また、$(...)バックティックよりも優れていることに注意してください。

関連情報