bash の if で数値比較をするには
シェルスクリプトやbash のターミナルで、数値と数字の比較をしたいとき。
どのような方法を取りますか?
a = 1 if (( a )) ; then echo 1 ; fi
数値を比較するには (())
ダブルパーレン
数字の比較演算子にC言語スタイルの比較を出来ればとても、覚えることが少ないと思います。sh やシェルスクリプトで書くと test
コマンド系のやり方が多くヒットして、とても憂鬱な気分になります。
比較演算子
Java や PHP や C言語でおなじみの比較演算子が bash でも使えます。
記号 | 意味 | サンプル |
---|---|---|
== | 等しい | if (( 1==1 )) |
> | 大きい | if (( 1>0 )) |
< | 小さい | if (( 1<0 )) |
>= | 同等か大きい | if (( 1>=0 )) |
<= | 同等か小さい | if (( 1<=0 )) |
!= | 等しくない | if (( 1!=0 )) |
ちなみに、<>
は使えません。
あれ?sh 独特のやつは?
使いません。覚えるのめんどくさい。読みにくい。
AND / OR / NOT はどうするの?
論理積・論理和・否定なども C言語スタイルで書くことが出来ます。
記号 | 意味 | サンプル |
---|---|---|
|| | 論理和 | if (( 1 || 1 )) |
&& | 論理積 | if (( 1 && 1 )) |
! | 否定 | if (( ! 1 )) |
条件を此のように書けば、とても簡単に扱うことが出来ます。
C言語スタイルで記述した bash
以上のことから、bash の if 文では、C言語スタイルの条件分岐を理解してれば、
数字計算においては、特に新しく覚える必要な無く、ぱぱっと書くことが出来ます。
x=1 if (( x == 1 )) ; then echo x is $x fi
変数の$
がいらないところが、ちょっと面食らうかもしれません。*1
for ループも同じ
for ループは if / while の組み合わせですから、此の書き方を覚えておくと、C言語スタイルのbash for ループも同じように認識することが出来ます。
for (( idx=0 ; idx<10 ; idx++ )) ; do echo $idx done
Arithmetic expressions と呼びます
今回紹介した書き方は、Arithmetic expressions と呼ばれる方式になります。
他にも
idx++ idx-- idx ? 1 : 0
のようなプログラムでよく見かける書き方があります。
その辺の書き方は、また次回。
追記
今回は、数値
の比較に絞っているのと、for 文の条件と併せたいので、(( ))
を使って記述しました。if の条件には if [[ expression ]]
を使うほうがより一般的かもしれません。