[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

16. 条件文

このセクションでは,その出力ではなく,終了ステータスが主に役に立つコマ ンドを記述します.このためそれらは,シェルのif文の条件やパイプ ラインの最後のコマンドとしてよく使用されます.

16.1 false: 何もせず失敗します  Do nothing, unsuccessfully.
16.2 true: 何もせず成功します  Do nothing, successfully.
16.3 test: ファイル形式の調査と値の比較  Check file types and compare values.
16.4 expr: 式の評価  Evaluate expressions.


16.1 false: 何もせず失敗します

falseは,失敗(failure)を意味する1の終了ステータスを返 す以外何もしません.それは,シェルスクリプトの失敗のコマンドが必要な位 置で使用することが可能です.

デフォルトで,falseは`--help'と`--version'を尊 重します.しかし,それはPOSIXに準拠していないので,環境変数 POSIXLY_CORRECTが設定されているとき,falseは, `--help'と`--version'を含む,すべてのコマンドライン引数 を無視します.

このバージョンのfalseは,Cプログラムとして実装されていて,そ のため,シェルスクリプトの実装より安全かつ高速になり,アカウントの使用 を禁止する目的のダミーシェルとして使用しても安全でしょう.

falseは,(ここで説明されている他のすべてのプログラムとは異な り) `--help'や`--version'を用いて呼び出されても,失敗の 終了ステータスを返しすことに注意して下さい.


16.2 true: 何もせず成功します

trueは,成功(success)を意味する0の終了ステータスを返す 以外何もしません.それは,シェルスクリプトの成功のコマンドが必要な位置 で使用することが可能ですが,シェル組み込みコマンド : (コロン)は 同じことをより高速に行います.最近のほとんどのシェルでは, trueが組み込みコマンドなので,スクリプトで`true'を使用 するとき,おそらくここで説明しているものではなく組み込みコマンドを使用 することになります.

デフォルトで,は`--help'と`--version'を尊重します.しか し,それはPOSIXに準拠していないので,環境変数 POSIXLY_CORRECTが設定されているとき,trueは `--help'と`--version'を含む,すべてのコマンドライン引数 を無視します.

このバージョンのtrueは,Cプログラムとして実装されていて,そ のため,シェルスクリプトの実装より安全かつ高速になり,アカウントの使用 を禁止する目的のダミーシェルとして使用しても安全でしょう.


16.3 test: ファイル形式の調査と値の比較

条件式exprの評価に依存して,0(真)または1(偽)のステータスを返しま す.式のそれぞれの部分は,分離された引数にする必要があります.

testには,ファイルのステータスの調査,文字演算子,そして数字 比較の演算子があります.

ほとんどのシェルには同じ名前の組み込みコマンドがあるため,スクリプト内 や対話的に簡素なコマンド名を使用すると,ここで記述するものと異なる機能 となる可能性があります.

以下のオプションの他に,testは,単独の`--help'や `--version'を受け入れます.See section 2. 共通のオプション. 単一のオプショ ン無しの引数も可能です.testは,引数がnullでない場合,真を返 します.

16.3.1 ファイル形式のテスト  -[bcdfhLpSt]
16.3.2 アクセス許可のテスト  -[gkruwxOG]
16.3.3 ファイルの特徴テスト  -e -s -nt -ot -ef
16.3.4 文字列のテスト  -z -n = !=
16.3.5 数値テスト  -eq -ne -lt -le -gt -ge
16.3.6 testの連結  ! -a -o


16.3.1 ファイル形式のテスト

これらのオプションは,ファイルの特定の形式をテストします.(ファイルの すべてですが,すべてのファイルが同じではありません!)

`-b file'
fileが存在し,ブロックスペシャルデバイスの場合は真です.

`-c file'
fileが存在し,キャラクタスペシャルデバイスの場合は真です.

`-d file'
fileが存在し,ディレクトリの場合は真です.

`-f file'
fileが存在し,通常のファイルの場合は真です.

`-h file'
`-L file'
fileが存在し,シンボリックリンクの場合は真です.

`-p file'
fileが存在し,名前付きパイプの場合は真です.

`-S file'
fileが存在し,ソケットの場合は真です.

`-t [fd]'
fdが端末上で開かれている場合は真です.fdが省略された場合, それはデフォルトで1(標準出力)になります.


16.3.2 アクセス許可のテスト

これらのオプションは,特定のアクセス許可をテストします.

`-g file'
fileが存在し,そのセットグループidビットが設定されている場合は真 です.

`-k file'
fileが存在し,スティッキー(sticky)ビットが設定されている場 合は真です.

`-r file'
fileが存在し,読み込み可能な場合は真です.

`-u file'
fileが存在し,セットユーザidビットが設定されている場合は真です.

`-w file'
fileが存在し,書き込み可能な場合は真です.

`-x file'
fileが存在し,実行可能な場合は真です.

`-O file'
fileが存在し,現在実施中のユーザidに所有されている場合は真です.

`-G file'
fileが存在し,現在実施中のグループidに所有されている場合は真です.


16.3.3 ファイルの特徴テスト

これらのオプションはその他のファイルの特徴を調査します.

`-e file'
fileが存在している場合は真です.

`-s file'
fileが存在し,大きさがゼロより大きい場合は真です.

`file1 -nt file2'
file1file2より(修正日で)新しい場合,または,file1 が存在しfile2が存在しない場合は真です.

`file1 -ot file2'
file1file2より(修正日で)古い場合,または,file2が 存在しfile1が存在しない場合は真です.

`file1 -ef file2'
file1file2が同じデバイスとi-node番号を持つ場合,すなわち, それらがお互いにハードリンクの場合は真です.


16.3.4 文字列のテスト

これらのオプションは文字列の特徴をテストします.文字列はtest に対して引用符で囲みませんが,例えばスペースのような,シェルで特別な意 味を持つ文字を保護するために,それらを引用符で囲む必要があるかもしれま せん.

`-z string'
stringの長さがゼロの場合は真です.

`-n string'
`string'
stringの長さがゼロではないの場合は真です.

`string1 = string2'
文字列が等しい場合は真です.

`string1 != string2'
文字列が等しくない場合は真です.


16.3.5 数値テスト

数値の関係です.引数は,完全な数値(負も可能です),または,string の長さを評価する特別な式-l stringにする必要があります.

`arg1 -eq arg2'
`arg1 -ne arg2'
`arg1 -lt arg2'
`arg1 -le arg2'
`arg1 -gt arg2'
`arg1 -ge arg2'
これらの算数の二項演算子は,それぞれ,arg1arg2に比べて, 等しい,等しくない,小さい,以下,大きい,または以上の場合に真を返しま す.

例えば以下のようにします.

 
test -1 -gt -2 && echo yes
=> yes
test -l abc -gt 1 && echo yes
=> yes
test 0x100 -eq 1
error--> test: integer expression expected before -eq


16.3.6 testの連結

通常の論理結合子です.

`! expr'
exprが偽の場合は真です.

`expr1 -a expr2'
expr1expr2の両方が真の場合は真です.

`expr1 -o expr2'
expr1またはexpr2のどちらかが真の場合は真です.


16.4 expr: 式の評価

exprは式を評価し,結果を標準出力に書き出します.それぞれの式 のトークンは,分離している引数にする必要があります.

オペランドは数字または文字列のどちらかになります.exprは,あ らゆるものが,適用されているオペレーションに依存して,整数または文字列 がオペランドの位置に存在することを強制します.

文字列はexpr対し引用符で囲みませんが,例えばスペースのような, シェルで特別な意味を持つ文字を保護するために,それらを引用符で囲む必要 があるかもしれません.

演算子は,挿入辞シンボルや前置キーワードとして与えることができます.カッ コは,通常の方法のグループとして使用してもかまいません(しかし,シェル がカッコを評価することを避けるために,カッコを引用符で囲む必要がありま す).

終了ステータスは,以下のようになります.

 
0 式がnullでも0でもない場合.
1 式がnullまたは0の場合.
2 有効な式の場合.

16.4.1 文字列式  + : match substr index length
16.4.2 数式  
16.4.3 exprの関係式  | & < <= = == != >= >
16.4.4 exprの使用例  Examples.


16.4.1 文字列式

exprは,パターンマッチングと,その他の文字列演算子をサポート します.これらは,(次のセクションの)数字と関係の両演算子より低い優先順 位になります.

`string : regex'
パターンマッチングを実行します.引数は文字列に制限され,二番目は, ^が暗黙に前置された(基本的にGNU流のgrepの)正規表 現と考えられます.最初の引数は,この正規表現に対しマッチの評価がなされ ます.

マッチの評価が成功し,regexが`\('と`\)'を使用している 場合,:式は,サブ式にマッチしたstringの一部となります.そ れ以外の場合はマッチした文字の数を返します.

マッチの評価に失敗した場合,regexで`\('と`\)'が使用さ れていれば:演算子はnull文字を返し,それ以外では0を返します.

最初の`\( ... \)'の組のみ,戻り値に関係します.追加の組は,正 規表現演算子のグループ化の意味しかありません.

正規表現内では,\+\?,そして\|は,それぞれ,1以 上,ゼロ以上,オア分離の選択肢の演算子です.SunOSとその他の exprはこれらを通常の文字として扱います.(POSIXは, どちらの動作も許可します.) 正規表現の構文の詳細は,See section `Regular Expression Library' in Regex. 例は16.4.4 exprの使用例 にあります.

`match string regex'
パターンマッチングを行う別の方法です.これは,`string : regex'と同じです.

`substr string position length'
少なくともlengthの長さの,positionから始まる,string のサブ文字列を返します.positionまたはlengthのどちらかが, 負,ゼロ,または数字以外の場合,null文字列を返します.

`index string charset'
charsetの最初の文字が見つかった,stringの最初の位置を返し ます.charsetの文字がstringで見つからない場合は,0を返しま す.

`length string'
stringの長さを返します.

`+ token'
キーワードのようなmatchや,演算子のような/の場合でも, tokenを文字列として解釈します.これで,expr length + "$x"expr + "$x" : '.*/\(.\)'のテストが可能となり,$xの値が (例えば)/indexに偶然なった場合でも,正しく動作します. この演算子はGNUの拡張です.移植性の高いシェルスクリプトでは, + "$token"の代わりに" $token" : ' \(.*\)'を使用 すべきです.

exprにキーワードとして文字列を解釈させるために,quote 演算子を使用する必要があります.


16.4.2 数式

exprは,通常の算術演算子をサポートし,優先順位は順に増加しま す.(前のセクションの)文字列演算子は,より順位の低い演算子で,(次のセ クションの)連結子は,より順位が高くなります.

`+ -'
加算と減算です.どちらの引数も数字が強制されます.そうでない場合はエラー を生じます.

`* / %'
乗算,除算,剰余です.どちらの引数も数字が強制されます.そうでない場合 はエラーを生じます.


16.4.3 exprの関係式

exprは,通常の論理結合と関係式をサポートします.これらは(前 のセクションの)文字や数字の演算子より優先順位が高くなっています.ここ に,低い優先順位を最初にしたリストがあります.

`|'
最初の引数がnullや0でない場合はそれを,それ以外では二番目の引数を返し ます.

`&'
どちらの引数もnullや0でない場合は最初の引数を,それ以外では0を返します.

`< <= = == != >= >'
引数を比較し,関係が真の場合は1を,それ以外では0を返します.===の同義語です.exprは最初に,両方の引数を数字に強制 し,数値の比較を行います.どちらかの強制が失敗した場合, LC_COLLATEで指定されている文字の対応表の順序を使用して,辞書的な 比較を行います.


16.4.4 exprの使用例

シェルのメタ文字を引用符で囲むものを含む例として以下のようなものがあり ます.

Bourne互換シェルで,シェル変数fooに1を加えます.

 
foo=`expr $foo + 1`

$fnameに保存されているファイル名のディレクトリ以外の部分を, /を含めずに出力します.

 
expr $fname : '.*/\(.*\)' '|' $fname

\+が演算子だということを表示する例です.

 
expr aaa : 'a\+'
=> 3

 
expr abc : 'a\(.\)c'
=> b
expr index abcdef cz
=> 3
expr index index a
error--> expr: syntax error
expr index quote index a
=> 0


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on February, 25 2004 using texi2html