それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashのif文で数字の比較を評価条件ぱぱっとやる方法ー(比較演算子やC言語スタイルforを使う)

bash の if で数値比較をするには

シェルスクリプトbash のターミナルで、数値と数字の比較をしたいとき。

どのような方法を取りますか?

a = 1

if (( a )) ;
then
   echo 1 ;
fi

私は、C言語スタイルの比較演算子を使うことが多いです。

数値を比較するには (()) ダブルパーレン

数字の比較演算子C言語スタイルの比較を出来ればとても、覚えることが少ないと思います。sh やシェルスクリプトで書くと test コマンド系のやり方が多くヒットして、とても憂鬱な気分になります。

比較演算子

JavaPHPC言語でおなじみの比較演算子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 ]]を使うほうがより一般的かもしれません。

参考資料

http://wiki.bash-hackers.org/syntax/arith_expr

http://mywiki.wooledge.org/ArithmeticExpression

*1: $は書いてもいいのですが、C言語スタイルであることを強調するために書いていません。