Linuxのコマンドライン上で簡単な計算を行いたいとき、「expr(エクスプレス)」というコマンドが役立ちます。特別なスクリプトを書くまでもなく、足し算や引き算、比較などの演算がすぐに実行できるこのコマンドは、シェルスクリプトでも頻繁に使われています。しかし、使い方にはいくつかの注意点やクセがあるため、初心者がつまずきやすいポイントもあります。この記事では、「expr」コマンドの基本的な使い方から応用例まで、具体的にわかりやすく紹介していきます。
exprコマンドとは?
「expr」は、LinuxやUnix系OSで使えるコマンドの一つで、主に数値や文字列の計算・評価を行います。数値の足し算・引き算・掛け算・割り算・比較などが可能で、シェルスクリプト内で変数の値を操作したいときに特に便利です。
たとえば、単純な足し算を実行したい場合は、次のように記述します。
expr 1 + 2
このコマンドの出力は 3
になります。
基本的な演算の使い方
足し算
expr 5 + 3
出力結果:8
スペースを空けないとエラーになるので注意しましょう。次のように書くとエラーです:
expr 5+3 # エラーになる
引き算
expr 10 - 4
出力結果:6
掛け算(* をエスケープ)
expr 6 \* 7
出力結果:42
*
はシェルで特殊な意味を持つため、バックスラッシュでエスケープする必要があります。
割り算(整数のみ)
expr 20 / 5
出力結果:4
割り算も整数同士の計算のみ対応しており、小数点以下は切り捨てになります。
expr 7 / 2
出力結果:3
変数との組み合わせ
expr はシェルスクリプト内で変数と組み合わせて使用することが多いです。
a=5
b=3
result=$(expr $a + $b)
echo $result
出力結果:8
$(expr ...)
のようにコマンド置換を使えば、計算結果を変数に格納したり、echoで表示することも可能です。
比較演算
数値の比較にも使えます。結果は「真」なら 1
、「偽」なら 0
が返ります。
等しいかどうか
expr 5 = 5
出力結果:1
expr 5 = 3
出力結果:0
大なり・小なり
expr 5 \> 3
出力結果:1
expr 3 \< 2
出力結果:0
注意点として、<
や >
もシェルで意味を持つため、バックスラッシュでエスケープする必要があります。
文字列の操作
「expr」は数値だけでなく、文字列にも対応しています。
文字列の長さを取得する
expr length "hello"
出力結果:5
部分文字列の抽出
expr substr "abcdef" 2 3
出力結果:bcd
(2文字目から3文字分)
マッチング(index)
expr index "abcdef" "c"
出力結果:3
注意点とよくあるエラー
スペースがないとエラーになる
expr 1+1
のように記述すると、「syntax error」となります。必ず演算子と数値の間にはスペースを入れましょう。
* や <, > はエスケープが必要
これらはシェルのメタ文字であるため、正しく動作させるにはエスケープが必須です。
NG例:
expr 2 * 3
正しくは:
bashコピーする編集するexpr 2 \* 3
if文やwhile文との組み合わせ
シェルスクリプトでは、expr
の出力を条件分岐に活用することもできます。
a=10
b=20
if [ $(expr $a \< $b) -eq 1 ]; then
echo "$a は $b より小さい"
fi
出力結果:10 は 20 より小さい
if
文の中でもエスケープは必要なので忘れないようにしましょう。
exprと他の計算方法の比較
expr
は便利ですが、最近のシェルスクリプトでは (( ))
や let
などの構文のほうが使われることも増えてきました。
(( ))構文の例
a=3
b=4
(( result = a + b ))
echo $result
この方法は演算子のエスケープが不要で、構文もシンプルです。
しかし、expr
はPOSIX準拠で古い環境でも動作するため、互換性を重視する場合には今でも多く使われています。
まとめ
expr
コマンドは、Linux環境でのちょっとした計算や文字列操作に重宝するツールです。以下のポイントを押さえておきましょう。
- 演算子と数値の間にはスペースが必要
*
,<
,>
はエスケープが必要- 文字列操作や比較にも使える
- POSIX互換なので古い環境でも動作
簡単な数値計算をシェルスクリプトで処理したいときには、まずこの「expr」から始めてみてはいかがでしょうか。応用も効くので、スクリプト作成の幅がぐっと広がります。