はじめに

こんにちは!今回はexprコマンドについて解説します。

exprは、数学式や文字列操作の式を評価するコマンドです。シェルスクリプトで計算や文字列操作をする時に活躍します。

古いスクリプトによく出てくるコマンドですね。

exprコマンドとは

exprは、数式や文字列操作を評価して結果を返す外部コマンドです。

主な機能:

  1. 数値計算 - 足し算、引き算、掛け算、割り算
  2. 比較演算 - 大小比較、等号比較
  3. 文字列操作 - 文字列の抽出、置換、長さの取得
  4. 正規表現マッチ - パターンマッチングと抽出
  5. 論理演算 - AND、OR、NOT

スクリプトで値を計算したり、文字列を処理したりするのに便利です。

基本構文

1
expr 式

複数の項や演算子を空白で区切ります。

主なオプション

演算子 説明
+ 足し算 expr 10 + 5
- 引き算 expr 10 - 3
* 掛け算 expr 10 '*' 5
/ 割り算 expr 20 / 4
% 余り expr 20 % 3
= 等号 expr 10 = 10
!= 不等号 expr 10 != 5
< より小さい expr 5 < 10
<= 以下 expr 5 '<=' 10
> より大きい expr 10 '>' 5
>= 以上 expr 10 '>=' 5

使用例

例1: 簡単な足し算

1
expr 10 + 5

実行結果:

1
15

最もシンプルな計算。

例2: 引き算

1
expr 20 - 8

実行結果:

1
12

シンプルな引き算。

例3: 掛け算(エスケープが必要)

1
expr 10 '*' 5

実行結果:

1
50

*はワイルドカードなので、シングルクォートで囲む必要があります。

例4: 割り算

1
expr 20 / 3

実行結果:

1
6

整数除算。小数点以下は切り捨て。

例5: 余り(モジュロ)

1
expr 20 % 3

実行結果:

1
2

割った時の余りを返します。

例6: 比較演算(等号)

1
2
expr 10 = 10
expr 10 = 5

実行結果:

1
2
1
0

真なら1、偽なら0を返す。

例7: 比較演算(大小比較)

1
2
expr 10 '>' 5
expr 10 '<' 5

実行結果:

1
2
1
0

大小比較も可能。

例8: 文字列の長さを取得

1
expr length "hello"

実行結果:

1
5

文字列の長さを返します。

例9: 部分文字列の抽出

1
expr substr "hello world" 1 5

実行結果:

1
hello

位置1から5文字を抽出。(1が最初の位置)

例10: インデックス(文字の位置)

1
expr index "hello" "l"

実行結果:

1
3

最初のlの位置は3。

Tips・注意点

シェル変数との組み合わせ

1
2
num=10
expr $num + 5

変数を使う時は$で展開。

掛け算は\*でエスケープ

1
2
3
4
5
6
# 正しい
expr 10 '*' 5
expr 10 \* 5

# 間違い
expr 10 * 5   # ワイルドカード展開されてエラー

シェルによるワイルドカード展開を防ぐ。

計算結果を変数に保存

1
2
result=$(expr 10 + 5)
echo $result

コマンド置換で結果を変数に保存。

実践的な使い方

ループカウンター

1
2
3
4
5
6
#!/bin/bash
i=1
while [ $(expr $i '<=' 10) -eq 1 ]; do
    echo "イテレーション $i"
    i=$(expr $i + 1)
done

ループで数値をインクリメント。

ファイルサイズチェック

1
2
3
4
5
6
7
#!/bin/bash
file_size=$( stat -c%s "$1" )
limit=$( expr 1024 '*' 1024 )  # 1MB

if [ $(expr $file_size '>' $limit) -eq 1 ]; then
    echo "ファイルが大きすぎます"
fi

ファイルサイズの上限チェック。

文字列操作

1
2
3
4
#!/bin/bash
email="[email protected]"
domain=$(expr substr "$email" $(expr index "$email" '@') 20)
echo "ドメイン: $domain"

文字列から特定部分を抽出。

奇数偶数判定

1
2
3
4
5
6
7
#!/bin/bash
num=10
if [ $(expr $num '%' 2) -eq 0 ]; then
    echo "偶数"
else
    echo "奇数"
fi

モジュロで奇数偶数を判定。

正規表現マッチング

1
2
3
4
5
#!/bin/bash
string="test123"
if expr "$string" : '.*[0-9]' > /dev/null; then
    echo "数字を含みます"
fi

正規表現でパターンマッチング。

まとめ

exprコマンドのポイント:

  • 式を計算・評価するコマンド
  • 数値計算: +-*(エスケープ必須)、/%
  • 比較: =!=<<=>>=
  • 文字列操作: length(長さ)、substr(部分抽出)、index(位置検索)
  • ワイルドカード: *'*'または\*でエスケープ必須
  • よく使う組み合わせ: expr $i + 1, expr length "$string"

古いスクリプトで出現頻度が高いですが、モダンなシェルではもっと便利な機能が多いですよ!