UNIX/Linuxのシェルの1つであるshやbashの演算子には、代入演算子、算術演算子、数値比較演算子、文字列比較演算子、論理演算子、条件演算子(三項演算子)、シフト演算子、ビット演算子、ファイル演算子、グループ化演算子、パターンマッチ演算子などがあります。
bashの代入演算子は、他の多くと同様、数値・文字列ともに=を使いますが、
代入演算子 | 使用法 | 意味 |
---|---|---|
= | variable=number variable=string | 左辺に右辺を代入 =と左辺・右辺の間にスペースを入れない |
いずれの場合も=と左辺・右辺の間にスペースは入れてはいけません。
#!/usr/bin/sh
curdir_foo=`find . -name "*"`
for var_bar in $curdir_foo
...
尚、bashではshell関数またはshell script内においてはバッククォートを伴い変数にコマンドを代入することもできます。
bashの算術演算子には四則演算の加減乗除と剰余があります。
算術演算子 | 使用法 | 意味 |
---|---|---|
+ | num1 + num2 | 加算 |
- | num1 - num2 | 減算 |
* | num1 * num2 | 乗算 |
/ | num1 / num2 | 除算 |
% | num1 % num2 | 剰余 |
$ expr 1 + 1
2
bashでは数値の計算には$(())または、exprコマンドを利用し、exprコマンドについては代入演算子とは逆で数値と演算子の間にはスペースを入れなければいけません(冒頭の$ドル記号はbashのshellプロンプトです)。
$ val=`expr 2 - 1`
$ echo $val
1
$ val=$((5*4))
$ echo $val
20
計算式を変数に代入する場合、expr式全体をバッククォートで括るか、exprコマンドを使わずに$(())で括ります。
尚、$(())の内側のカッコの中の式は左辺の前、左辺~演算子~右辺間、右辺の後ろなどにはスペースがあってもなくても式自体は成立します。
ちなみに、バッククォートなしでイコールの右辺のみスペースを入れ[val= expr 2 - 1]としても実行できる場合もありますが敢えて利用する意味はないでしょう。
bashの数値比較演算子は、Perl(では文字列比較演算子)とは逆の演算子を使用します。
数値比較演算子 | 使用法 | true条件 |
---|---|---|
-gt | num1 -gt num2 | > より大きい |
-lt | num1 -lt num2 | < より小さい |
-ge | num1 -ge num2 | >= より大きいか等しい |
-le | num1 -le num2 | <= より小さいか等しい |
-eq | num1 -eq num2 | == 等しい |
-ne | num1 -ne num2 | != 等しくない |
-OP | num1 -OP num2 | 算術多項演算子 -OPは、-gt/-lt/-ge/-le/-eq/-neのいずれか1つを表し、それぞれがtrueを返す num1、num2は内部または外部整数である場合がある |
数値比較演算子と左辺・右辺との間にはスペースを入れます。
bashの文字列比較演算子は、Perl(では数値比較演算子)とは逆の演算子を使用し、それに加えてNullの判定を行う演算子があります。
文字列比較演算子 | 使用法 | true条件 |
---|---|---|
= | string1 = string2 | 等しい(イコール記号1つ) |
!= | string1 != string2 | 等しくない |
< | string1 < string2 | ASCII順においてより小さい |
> | string1 > string2 | ASCII順においてより大きい |
-n | -n string | 文字列の長さがゼロではない |
-z | -z string | 文字列の長さがゼロである |
文字列比較演算子と左辺・右辺との間にはスペースを入れます。
$ string="bash "
$ value="operator"
$ phrase=$string$value
$ echo $phrase
bash operator
bashにはPerlの[.](ドット)に当たるような変数など文字を連結する文字列結合演算子はありませんが、単にスペースを入れずに変数同士をつなげて書けば連結されます。
$ phrase=$string'operator'
$ echo $phrase
bash operator
$ phrase=$string"operator"
$ echo $phrase
bash operator
$ phrase=${string}operator
$ echo $phrase
bash operator
但し、変数、文字列の順で結合する必要がある場合に限っては、固定文字列をシングルクォートまたはダブルクォートで括るか、変数名を{ }で括ります(組み合わせても可)。
当然、このようなケースで連結しない場合であっても変数名を{ }で括ることは可能です。
尚、パラメータ展開でも変数名を{ }で括ります。
bashの論理演算子は下記の通りです。
論理演算子 | 使用法 | 意味 |
---|---|---|
&& | [ cond1 ] && [ cond2 ] | 論理積(論理AND) |
|| | [ cond1 ] || [ cond2 ] | 論理和(論理OR) |
! | ! condition | 論理否定/論理反転(否定NOT) |
また、Bourne Shell組み込みコマンドのtestコマンドにおける論理演算子は下記の通りです。
論理演算子 | 使用法 | 意味 |
---|---|---|
-a | [ cond1 -a cond2 ] | && 論理積(論理AND) |
-o | [ cond1 -o cond2 ] | || 論理和(論理OR) |
! | [ ! condition ] | 論理否定/論理反転(否定NOT) |
尚、testコマンドのコーディングには、文字列"test"もしくはスクエアブラケット内でスペースを入れて式を続ける次のような方法があります。
test 式
[ 式 ]
bashの三項演算子は下記の通りです。
三項演算子 | 意味 |
---|---|
expr1 ? expr2 : expr3 | expr1が真ならexpr2、expr1が偽ならexpr3を実行 多くのスクリプトやプログラミング言語で言うところのif...else文 C言語/Java/Perlではif文にこの記述を使うこともできる |
シフト演算子 | 意味 |
---|---|
<< | 左へビットシフト |
>> | 右へビットシフト |
bashのシフト演算子は他のシフト演算子同様、ビット列を左または右へシフトする際に使用します。
bashで使用するビット演算子は下記の通りで他のビット演算子同様、値を(必要であれば変換し)2進数として演算を行います。
ビット演算子 | 意味 |
---|---|
& | ビット論理積/ビットAND |
| | ビット論理和/ビットOR |
^ | ビット排他的論理和/ビットXOR演算子 |
? | ビット反転演算子[0111]→[1000] |