Bash Basics | Basicsトップページ | トップページ
式
シェルでは算術式や条件式を演算子を使って記述することができます。
シェルでは複合コマンドの((、組込コマンドのlet、および算術式展開で算術式が評価されます。
算術式の評価は固定長の整数(内部的にはintmax_tであり、ほとんどのシステムでは64ビットの符号付き整数)として行われますが、オーバーフローのチェックは行われないのでご注意ください。
0での除算はトラップされ、エラーとしてのフラグが立てられます。
bashの算術式は演算子とオペランド(被演算子)の組み合わせで構成されます。
以下の表のオペランドが使用できます。
種類 | 説明 |
---|---|
10進数リテラル | 10進数表記の数字です。 1から9で始まる数字の並びは10進数のリテラルと解釈されます。
|
8進数リテラル | 8進数表記の数字です。 0で始まる数字の並びは8進数のリテラルと解釈されます。
|
16進数リテラル | 16進数表記の数字です。 0xまたは、0Xで始まる数字とAからF(およびaからf)の文字の並びは16進数のリテラルと解釈されます。
|
n進数リテラル | 任意のn進数表記の数字です。 n#(nは2以上64以下の数字)で始まる数字とAからF、およびaからfと@、_の文字の並びはn進数のリテラルと解釈されます。 nが36以下の場合、aからz(およびAからZ)の文字が10から35の値を意味します。nが36より大きい場合、英小文字aからzの文字が10から35を意味し、英大文字AからZの文字が36から61を意味します。62は@、63は_で記述します。
|
変数 | 任意の変数の名前を算術式内で記述することができます。 未定義の変数や値が空の変数は0として評価されます。
|
優先順位 | 結合規則 | 演算子 | 名前 | 説明 |
---|---|---|---|---|
1 | 左から右 | 変数名++ | 後置インクリメント演算子 | 変数の値を評価し、その後、変数の値をインクリメント(値を1加算)します。
|
変数名-- | 後置デクリメント | 変数の値を評価し、その後、変数の値をデクリメント(値を1減算)します。
| ||
2 | 右から左 | ++変数名 | 前置インクリメント演算子 | 変数の値をインクリメント(値を1加算)し、その後、変数の値を評価します。
|
--変数名 | 前置デクリメント | 変数の値をデクリメント(値を1減算)し、その後、変数の値を評価します。
| ||
3 | 右から左 | - | 負の符号 | 単項式の値を負として評価(符号を反転)します。
|
+ | 正の符号 | 単項式の値を正として評価します。
| ||
4 | 右から左 | ! | 論理的否定 | 算術式を論理否定(算術式の評価結果が0以外であれば0を返し、算術式の結果が0であれば1を返します)します。
|
~ | 1の補数演算子 | 算術式の値のビット単位の補数を生成(ビットを反転)します。
| ||
5 | 右から左 | ** | 指数(累乗) | bashの拡張で演算子の左辺の値を右辺の値で累乗します。
|
6 | 左から右 | * | 乗算 | 演算子の左辺の値を右辺の値で乗算します。
|
/ | 除算 | 演算子の左辺の値を右辺の値で除算します。
| ||
% | 剰余 | 演算子の左辺の値を右辺の値で除算した剰余を演算します。
| ||
7 | 左から右 | + | 加算 | 演算子の左辺の値に右辺の値を加算します。
|
- | 減算 | 演算子の左辺の値から右辺の値を減算します。
| ||
8 | 左から右 | << | 左ビットシフト | 演算子の左辺の値を右辺の値のビット数分だけ左にシフトします。
|
>> | 右ビットシフト | 演算子の左辺の値を右辺の値のビット数分だけ右にシフトします。 負の値を右ビットシフトした場合、符号拡張が行われます。
| ||
9 | 左から右 | <= | 大小比較 | 演算子の左辺の値に対して右辺の値が等しいか大きければ1を返し、小さければ0を返します。
|
>= | 大小比較 | 演算子の左辺の値に対して右辺の値が等しいか小さければ1を返し、大きければ0を返します。
| ||
< | 大小比較 | 演算子の左辺の値に対して右辺の値が大きければ1を返し、等しいか小さければ0を返します。
| ||
> | 大小比較 | 演算子の左辺の値に対して右辺の値が小さければ1を返し、等しいか大きければ0を返します。
| ||
10 | 左から右 | == | 等値比較 | 演算子の左辺の値と右辺の値が等しければ1を返し、等しくなければ0を返します。
|
!= | 非等値比較 | 演算子の左辺の値と右辺の値が等しくなければ1を返し、等しければ0を返します。
| ||
11 | 左から右 | & | ビット単位のAND | 演算子の左辺の値を右辺の値のビットと比較し、両方のビットが1の場合のみ対応するビットが1となり、それ以外の場合は対応するビットが0となります。
下記のスクリプトはカレントディレクトリの全てのファイルに対して権限を確認する例です。
|
12 | 左から右 | ^ | ビット単位の排他的OR | 演算子の左辺の値を右辺の値のビットと比較し、両方のビットが異る(一方のビットが1でもう一方のビットが0)場合のみ対応するビットが1となり、それ以外の場合は対応するビットが0となります。
|
13 | 左から右 | | | ビット単位のOR | 演算子の左辺の値を右辺の値のビットと比較し、どちらかまたは両方のビットが1の場合のみ対応するビットが1となり、両方のビットが0の場合は対応するビットが0となります。
|
14 | 左から右 | && | 論理的AND | 演算子の左辺を評価し、0以外であれば右辺を評価します。 両方の評価結果が0以外の場合のみ1を返し、それ以外の場合は0を返します。 左辺の評価結果が0であれば、右辺は評価されません。
最後の例は左辺の評価結果が0であるため、右辺が評価されず、0除算のエラーが発生しません。 |
15 | 左から右 | || | 論理的OR | 演算子の左辺を評価し、0であれば右辺を評価します。 両方の評価結果が0の場合のみ0を返し、それ以外の場合は1を返します。 左辺の評価結果が0以外であれば、右辺は評価されません。
最後の例は左辺の評価結果が0以外であるため、右辺が評価されず、0除算のエラーが発生しません。 |
16 | 右から左 | 式1?式2:式3 | 条件演算子 | 式1の評価結果が0以外であれば、式2を評価してその結果を返します。 式1の評価結果が0であれば、式3を評価してその結果を返します。
|
17 | 右から左 | = | 代入演算子 | 演算子の左辺の変数に右辺の値を代入し、その値を返します。
|
*= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値で乗算した値を代入し、その値を返します。
| ||
/= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値で除算した値を代入し、その値を返します。
| ||
%= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値で除算した剰余を代入し、その値を返します。
| ||
+= | 代入演算子 | 演算子の左辺の変数にその変数の値に右辺の値を加算した値を代入し、その値を返します。
| ||
-= | 代入演算子 | 演算子の左辺の変数にその変数の値から右辺の値を減算した値を代入し、その値を返します。
| ||
<<= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値のビット数分だけ左にシフトした値を代入し、その値を返します。
| ||
>>= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値のビット数分だけ右にシフトした値を代入し、その値を返します。 負の値を右ビットシフトした場合、符号拡張が行われます。
| ||
&= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値のビットと比較し、両方のビットが1の場合のみ対応するビットが1となり、それ以外の場合は対応するビットが0となる値を代入し、その値を返します。
| ||
^= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値のビットと比較し、両方のビットが異る(一方のビットが1でもう一方のビットが0)場合のみ対応するビットが1となり、それ以外の場合は対応するビットが0となる値を代入し、その値を返します。
| ||
|= | 代入演算子 | 演算子の左辺の変数にその変数の値を右辺の値のビットと比較し、どちらかまたは両方のビットが1の場合のみ対応するビットが1となり、両方のビットが0の場合は対応するビットが0となる値を代入し、その値を返します。
| ||
18 | 左から右 | 式1,式2 | カンマ演算子 | 演算子の左辺と右辺の両方を評価し、右辺の評価結果の値を返します。
|
シェルでは複合コマンドの[[、組み込みコマンドのtestと[を組み合わせることによって条件式が評価されます。
bashの条件式は演算子と単項または二項のプライマリで構成され、真(0)または偽(1)を返します。
[[と]]の間にある単語に対してはパス名展開と単語の分割は行われません。チルダ展開、パラメータ展開、算術式展開、コマンド置換、プロセス置換、クォートの削除は行われます。
条件式の演算子はクォートされてはいけません。
プライマリはファイル、シェルオプション名、変数名、文字列、整数のいずれかです。
プライマリがファイルの場合は以下の通りとなります。
ファイルの指定 | 説明 |
---|---|
ファイル名またはパス | シンボリックリンクが指定された場合、リンク先のファイルが対象となります。 それ以外の場合、指定されたファイルまたはパスが対象となります。 |
/dev/fd/nの形式 | ファイルディスクリプタnが対象となります。 |
/dev/stdinの形式 | 標準入力が対象となります。 |
/dev/stdoutの形式 | 標準出力が対象となります。 |
/dev/stderrの形式 | 標準エラー出力が対象となります。 |
演算子とプライマリの指定 | 説明 |
---|---|
-a ファイル | ファイルが存在していれば真、存在していなければ偽を返します。 |
-b ファイル | ファイルが存在し、かつブロック特殊ファイルであれば真、それ以外であれば偽を返します。 |
-c ファイル | ファイルが存在し、かつキャラクター特殊ファイルであれば真、それ以外であれば偽を返します。 |
-d ファイル | ファイルが存在し、かつディレクトリであれば真、それ以外であれば偽を返します。 |
-e ファイル | ファイルが存在していれば真、存在していなけれ ば偽を返します。 |
-f ファイル | ファイルが存在し、かつ通常ファイルであれば真、それ以外であれば偽を返します。 |
-g ファイル | ファイルが存在し、かつSGIDが設定されていれば真、それ以外であれば偽を返します。 |
-h ファイル | ファイルが存在し、かつシンボリックリンクであれば真、それ以外であれば偽を返します。 |
-k ファイル | ファイルが存在し、かつスティッキービットが設定されていれば真、それ以外であれば偽を返します。 |
-p ファイル | ファイルが存在し、かつ名前付きパイプ(FIFO)であれば真、それ以外であれば偽を返します。 |
-r ファイル | ファイルが存在し、かつ読み込み可能(読み込み権限がある)であれば真、それ以外であれば偽を返します。 |
-s ファイル | ファイルが存在し、かつそのファイルのサイズが0より大きければ真、それ以外であれば偽を返します。 |
-t ファイルディスクリプタ | ファイルディスクリプタがオープンされており、かつ端末を参照(標準入出力など)していれば真、それ以外であれば偽を返します。 |
-u ファイル | ファイルが存在し、かつSUIDが設定されていれば真、それ以外であれば偽を返します。 |
-w ファイル | ファイルが存在し、かつ書き込み可能(書き込み権限がある)であれば真、それ以外であれば偽を返します。 |
-x ファイル | ファイルが存在し、かつ実行可能(実行権限がある)であれば真、それ以外であれば偽を返します。 |
-G ファイル | ファイルが存在し、かつ現在のシェルの実効グループIDに所有されていれば真、それ以外であれば偽を返します。 |
-L ファイル | ファイルが存在し、かつかつシンボリックリンクであれば真、それ以外であれば偽を返します。 |
-N ファイル | ファイルが存在し、最終アクセス日時以降にファイルの内容が変更されていれば真、それ以外であれば偽を返します。 |
-O ファイル | ファイルが存在し、かつ現在のシェルの実効ユーザーIDに所有されていれば真、それ以外であれば偽を返します。 |
-S ファイル | ファイルが存在し、かつソケットであれば真、それ以外であれば偽を返します。 |
ファイル1 -ef ファイル2 | ファイル1とファイル2のデバイス番号とiノード番号が同じであれば真、それ以外であれば偽を返します。 |
ファイル1 -nt ファイル2 | ファイル1とファイル2の最終修正日時を比較し、ファイル1がより新しいか、ファイル1が存在していてファイル2が存在しなければ真、それ以外であれば偽を返します。 |
ファイル1 -ot ファイル2 | ファイル1とファイル2の最終修正日時を比較し、ファイル2がより新しいか、ファイル2が存在していてファイル1が存在しなければ真、それ以外であれば偽を返します。 |
-o オプション | シェルのオプションが有効であれば真、それ以外であれば偽を返します。 setコマンドの-oオプションで指定できるオプションが指定できます。 |
-v 変数 | 変数が設定されて(値が代入されて)いれば真、それ以外であれば偽を返します。 |
-z 文字列 | 文字列の長さが0であれば真、それ以外であれば偽を返します。 |
-n 文字列 | 文字列の長さが0でなければ真、それ以外であれば偽を返します。 |
文字列1 == 文字列2 または 文字列1 = 文字列2 | 文字列1と文字列2が同じであれば真、それ以外であれば偽を返します。 POSIXに準拠する場合、==ではなく、=を使用する必要があります。 文字列2はパターンとして解釈されパターンマッチングで評価されます。 パターンの一部または全体をクォートすることで単純な文字列としてマッチングさせることができます。 シェルのオプションnocasematchが有効であればパターンマッチングでアルファベットの大文字と小文字の区別はされません。 実行例:
*は任意の文字列にマッチするため条件式は真となります。
パターンがダブルクォートでクォートされているため*が単純な文字として認識されて一致しないため条件式は偽となります。
文字列2に空白文字が含まれているため、2つの単語として認識され構文エラーとなります。
上記例のエラーを回避するために空白文字をバックスラッシュでクォートしています。これで空白文字は単純な文字として認識され、続く*は任意の文字列にマッチするため条件式は真となります。
$で始まる${WORD2}はパラメータ展開されます。${WORD2}の値に含まれる*は任意の文字列にマッチするため条件式は真となります。
$で始まる${WORD}、および${WORD2}はパラメータ展開されます。どちらもダブルクォートでクォートされているため${WORD2}の値に含まれる*は単純な文字として認識されて一致しないため条件式は偽となります。
パターンには文字クラス(Character Class)、等値クラス(Equivalence Class)、照合シンボル(Collating Symbol)文字クラスや照合シンボルを組み合わせることも可能です。
文字列1はパターンとして解釈されず、単純な文字列として扱われ一致しないため条件式は偽となります。
シェルのオプションnocasematchが有効であり英大文字と英小文字は同じとして扱われて文字列にマッチするため条件式は真となります。 |
文字列1 != 文字列2 | 文字列1と文字列2が同じでなければ真、それ以外であれば偽を返します。 文字列2はパターンとして解釈されパターンマッチングで評価されます。 パターンの一部または全体をクォートすることで単純な文字列として マッチングさせることができます。 シェルのオプションnocasematchが有効であればパターンマッチングで アルファベットの大文字と小文字の区別はされません。 |
文字列1 =~ 文字列2 | 文字列2を拡張正規表現と見做して文字列1と文字列2を比較します。 パターンがマッチすれば真、それ以外であれば偽を返します。正規表現が文法的に誤っている場合、2を返します。 パターンの一部または全体をクォートすることで単純な文字列として マッチングさせることができます。 シェルのオプションnocasematchが有効であればマッチングでアルファベットの大文字と小文字の区別はされません。 正規表現中の括弧による部分式にマッチした部分文字列は配列変数"BASH_REMATCHに保存されあとから参照可能となります。BASH_REMATCHのキーが0の要素は正規表現全体にマッチした文字列が保存され、キーがnの要素は正規表現のn番目の括弧の部分式にマッチした文字列が保存されます。 実行例:
|
文字列1 < 文字列2 | 現在のロケールで文字列1と文字列2を比較した場合、文字列1が文字列2よりも辞書順で前にあれば真、それ以外であれば偽を返します。 |
文字列1 > 文字列2 | 現在のロケールで文字列1と文字列2を比較した場合、文字列1が文字列2よりも辞書順で後にあれば真、それ以外であれば偽を返します。 |
整数1 -eq 整数2 | 整数1と整数2が等しければ真、それ以外であれば偽を返します。 |
整数1 -ne 整数2 | 整数1と整数2が等しくなければ真、それ以外であれば偽を返します。 |
整数1 -lt 整数2 | 整数1が整数2よりも小さければ真、それ以外であれば偽を返します。 |
整数1 -le 整数2 | 整数1が整数2よりも小さいか等しければ真、それ以外であれば偽を返します。 |
整数1 -gt 整数2 | 整数1が整数2よりも大きければ真、それ以外であれば偽を返します。 |
整数1 -ge 整数2 | 整数1が整数2よりも大きいか等しければ真、それ以外であれば偽を返します。 |