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

16. 条件文

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


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にゼロ以外のステータスで終了させることも可能であ ることに注意して下さい.非POSIXモードで呼び出され, `--help'や`--version'オプションを用い,標準出力が閉じら れている,またはI/Oエラーとなるファイルにリダイレクトするときがそうで す.例えば,Bouene互換シェルでの使用例です.

 
$ ./true --version >&-
./true: write error: Bad file number
$ ./true --version > /dev/full
./true: write error: No space left on device

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


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

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

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

testには,`test'を前置する代わりに四角い開括弧,閉括弧 と使用する,もう一つの形式があります.例えば,`test -d /'の代わり に`[ -d / ]'と書くことも可能です.四角い括弧は分離されている引数 にする必要があります.例えば,`[-d /]'では期待した効果になりませ ん. `test expr'と`[ expr ]'には同じ意味があるの で,以下では前者の形式だけを議論していきます.

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

以下のオプションの他に,単一の引数も可能です.引数が空でない場合, testはtrueを返します.任意の文字列の引数が可能で,それらの文 字列には`-d',`-1',`--',`--help',そして `--version'といった,他のプログラムのほとんどがオプションとして処 理するものも含まれます.ヘルプやバージョン情報を取得するため,コマンド `[ --help'と`[ --version'を,いつもの閉じ括弧を用いずに呼び 出して下さい.See section 共通のオプション.

終了ステータスです.

 
0 式がtrueの場合.
1 式がfalseの場合.
2 エラーが生じた場合.

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が端末に関連づけられているファイル記述子の場合は真です.


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対し引用符で囲みませんが,例えばスペースのような, シェルで特別な意味を持つ文字を保護するために,それらを引用符で囲む必要 があるかもしれません.しかし,引用符で囲まれているかどうかに依存せず, 文字列オペランドは,括弧や+のようなexprの演算子にすべ きではなく,引用符で囲まれているものを評価するために,任意の文字列を $strをシェルに渡すことは安全ではありません.これを排比する方法 の一つは,GNUの拡張+ (例えば+ "$str" = foo)で す.より移植性の高い方法は," $str"を使用し,前置するスペー スを数に入れるため式の結果を調整することです(例えば" $str" = " foo").

オプションとして間違って解釈される可能性があるので,符の整数や前に `-'が付く文字列をexprの最初の引数として渡すべきではあり ません.これは,括弧で避けることが可能です.また,移植性の高いスクリプ トでは,整数の形式となりうる文字列演算子を使用すべきではありません.こ れは,上記のスペースを前置する方法で回避可能です.

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

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

 
0 式がnullでも0でもない場合.
1 式がnullまたは0の場合.
2 式が構文上有効な場合.
3 エラーが生じた場合.

16.4.1 文字列式

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

` string : regex'

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

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

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

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

正規表現内では,\+\?,そして\|は,それぞれ,1以 上,ゼロ以上,オア分離の選択肢の演算子です.SunOSとその他の exprはこれらを通常の文字として扱います.(POSIXは, どちらの動作も許可します.) 正規表現の構文の詳細は,See (regex)Top section `Regular Expression Library' in Regex. 例は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でもゼロでもない場合はそれを,それ以外では,二番目の引 数がnullでもゼロでもない場合はそれを,それ以外では0を返します.最初の 引数がnullでもゼロでもない場合,二番目の引数と同じにはなりません.

` &'

どちらの引数もnullやゼロでない場合は最初の引数を,それ以外では0を返し ます.最初の引数がnullでもゼロでもない場合,二番目の引数と同じにはなり ません.

` < <= = == != >= >'

引数を比較し,関係が真の場合は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 June, 8 2005 using texi2html 1.70.