exprコマンドは式を評価し、その結果を標準出力に出力します。
評価する式は様々で、文字列、数値、論理を評価することができます。
文字列の評価
正規表現
正規表現を用いる場合は、
1 |
expr string : regex |
またはmatchという文字列を最初に記述した
1 |
expr match string regex |
を使用することができます。
実行した結果はマッチした文字数になります。
また、グループ化の「\( \)」を用いた場合は、最初にグループ化した文字列を結果として表示します。
マッチした文字数を確認する場合のコマンド例は以下のようになります。
コマンド例
1 |
expr abcde : "a.*e" |
または
1 |
expr match abcde "a.*e" |
実行結果
1 |
5 |
グループ化を使用したのコマンド例は以下のようになります。
コマンド例
1 |
expr abcde : "a\(.*\)e" |
または
1 |
expr match abcde "a\(.*\)e" |
実行結果
1 |
bcd |
部分文字列
部分文字列はsubstrを用いて以下のようにすることができます。
1 |
expr substr string position length |
positionやlengthは数値を取り、その数値が0や負の数の場合はnull文字になります。
コマンド例
1 |
expr substr abcde 1 1 |
実行結果
1 |
a |
コマンド例
1 |
expr substr abcde 2 3 |
実行結果
1 |
bcd |
コマンド例
1 |
expr substr abcde 99 3 |
実行結果はnull文字
コマンド例
1 |
expr substr abcde 2 99 |
実行結果
1 |
bcde |
文字を位置
indexを用いると特定の文字がある位置を見つけることができます。
1 |
expr index string charset |
特定の文字が見つかった場合は最初に発見した位置を表示します。
文字が見つからない場合は0が表示されます。
コマンド例
1 |
expr index abcde eab |
実行結果
1 |
1 |
文字列の長さ
lengthを用いると文字列の長さがわかります。
1 |
expr length string |
コマンド例
1 |
expr length abcde |
実行結果
1 |
5 |
文字列の注意
変数の文字列がmatchやlengthのキーワードなどの場合は、構文エラーを起こす可能性があります。その場合は以下のようにします。
1 |
+ string |
+演算子はGNU拡張であるため、または
1 |
'(' " $var" : ' \(.*\)' ')' |
のように変数の前と正規表現の前それぞれにスペース入れ、正規表現のグループ化で文字列を取り出し、exprコマンドの括弧で演算をグループ化する方法をとります。
例えば、エラーが起きる例は以下のようなものです。
コマンド例
1 |
expr length 'length' |
これを対処するには+演算子や正規表現のグループ化で取り出した文字列を利用します。
コマンド例
1 |
expr length + 'length' |
または
1 |
expr length '(' " length" : ' \(.*\)' ')' |
実行結果
1 |
6 |
整数の計算
exprコマンドは整数の計算を行うことができます。
計算は加算、減算、乗算、除算、剰余演算ができ、
演算子は「+」、「-」、「*」、「/」、「%」の5つの演算子を用いることができます。
コマンド例(加算)
1 |
expr 1 + 2 |
実行結果
1 |
3 |
コマンド例(剰余演算)
1 |
expr 13 % 10 |
実行結果
1 |
3 |
論理演算子や関係演算子
ORやAND
exprコマンドはORとして「|」、ANDとして「&」を用いることができます。ただし、シェルの文字として扱われないように演算子を引用符を用いて文字列を囲む必要があります。
「|」演算子は、最初の引数がnullもしくは0でなければ、最初の引数を返し、
2つ目の引数がnullもしくは0でなければ、2つ目の引数を返し、
それ以外なら、0を返します。
コマンド例
1 |
expr 'b' "|" 'a' |
実行結果
1 |
b |
「&」演算子は、2つの引数がnullもしくは0でなければ、最初の引数を返し、
それ以外なら、0を返します
コマンド例
1 |
expr 'a' "&" 'a' |
実行結果
1 |
a |
関係
関係として、「<」、「<=」、「==」、「!=」、「=>」、「>」の演算子を用いることができます。演算子をシェルの演算として解釈されないように引用符で囲む必要があります。
関係が正しければtrueとして1を正しくなければfalseとして0を返します。
コマンド例
1 |
expr 1 '<' 2 |
実行結果
1 |
1 |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版