bash: == および `bc` 出力タイプを使用する -eq

bash: == および `bc` 出力タイプを使用する -eq

このコードは、存在しない関数を(適切に)シミュレートするより大きなスクリプトから得られましたabs()

[[ $(echo "$val < 0" | bc) -eq 1 ]] && val=$(echo "$val * -1" | bc)

したがって、数値が負であるかどうかをテストします。その場合、&&次の2番目の文が実行されます。これが私のオリジナルラインです。

他のSEユーザーの中には、後で次のように変更しました。

(( $(bc <<<"$val < 0") == 1 )) && val=$(bc <<<"$val * -1")

まあ、これらの両方は明らかに動作しますが、演算子-eq(実装されている)だけを使用するのではないので、私はまだ私のことを好みます。特に文字列でない場合)、ここでは文字列も避けているので、読み取り専用環境ではコードがうまく機能します。 (/tmpこの文字列が機能するには文字列に書き込み可能でなければならないことを覚えておいてください。)

bc最後に、次の行は実際の整数が出力されることを覚えているようです==。これは文字列にのみ推奨されるため、使い方はやや問題になります。残念ながら、そのページは結果を純粋な数字で出力するのか、それとも文字列として出力するのかを公開bcしません。man

コメント?

答え1

あなたはここで混乱しています。

[[ $(echo "$val < 0" | bc) -eq 1 ]]どちらも(( $(bc <<<"$val < 0") == 1 ))整数比較を使用します。

((..))、およびのlet組み込み機能と同じです。kshbashzsh算術表現。では、((..))すべての演算子と優先順位、関連性、値がCと同じです。

混乱する可能性があるのは、==新しいテスト演算子の内部です[[...]]。利用可能な場合はパターンマッチング==と同じです=。文字列を比較するには、両側に二重引用符を入れる必要があります[[ "$a" == "$b" ]]

関連情報