You are in US.
It is 23:38 JST now.

実行オプション
- 各行の内容を表示する
set -x: 実行時、通常表示されないシェルスクリプトを表示する。 #!/bin/sh -x と同等
set +x: 元に戻す(表示しないようにする)
なお表示されるコマンド行の前には+が付く。 - コマンドの実行に失敗したらその場で終了する
#!/bin/sh set -e ls /eetc/fstav <----- file not found この後終了 echo Good - 未定義の変数を使用すると終了
set -u
条件式
条件式では,数値比較,文字列比較,ファイル属性,論理演算子および三項演算子を使用します。条件式の共通仕様を説明します。
- testコマンドまたはletコマンドを使用して条件評価を行います。testコマンドは代替書式である[[]]を含みます。また,letコマンドは代替書式である(())を含みます。
- testコマンドを使用して条件評価する場合,変数と演算子の間にスペースを入れてください。testコマンドの代わりに[[]]を使用する場合は,「[[」の直後と「]]」の直前にスペースを入れてください。
letコマンドの引数にtestコマンドの引数(-eqなど)を指定した場合,letコマンドは変数と解釈して動作します。
[[]]を使用して条件判定するときの使用例を次に示します。
- [[]]で条件判定するときの使用例
-
if [[ $arg1 -eq $args ]]; then echo TRUE fi
数値の比較に使用する演算子を次の表に示します。
| 演算子を用いた条件式 | 判定 | testコマンドまたは[[]]での使用可否 | letコマンドまたは(())での使用可否 |
|---|---|---|---|
| 数値1 -eq 数値2 | 数値1と数値2が等しい場合は真。 | ○ | × |
| 数値1 -ne 数値2 | 数値1と数値2が等しくない場合は真。 | ○ | × |
| 数値1 -ge 数値2 | 数値1が数値2以上の場合は真。 | ○ | × |
| 数値1 -gt 数値2 | 数値1が数値2より大きい場合は真。 | ○ | × |
| 数値1 -le 数値2 | 数値1が数値2以下の場合は真。 | ○ | × |
| 数値1 -lt 数値2 | 数値1が数値2より小さい場合は真。 | ○ | × |
| 数値1 == 数値2 | 数値1と数値2が等しい場合は真。 | ○※1 | ○ |
| 数値1 != 数値2 | 数値1と数値2が等しくない場合は真。 | ○※1 | ○ |
| 数値1 >= 数値2 | 数値1が数値2以上の場合は真。 | × | ○ |
| 数値1 > 数値2 | 数値1が数値2より大きい場合は真。 | ○※1※2 | ○ |
| 数値1 < 数値2 | 数値1が数値2より小さい場合は真。 | ○※1※2 | ○ |
| 数値1 <= 数値2 | 数値1が数値2以下の場合は真。 | × | ○ |
- (凡例)
- ○:使用できます。
- ×:使用できません。
- 注※1
- 数値ではなく,文字列として比較します。
- 注※2
- [[ ]]で使用できます。testコマンドでは使用できません。
数値比較の使用例を次に示します。
a=1 b=2 if [[ $a -lt $b ]]; then echo TRUE else echo FALSE fi while (( $a != $b )); do echo LOOP ((a+=1)) done |
文字列の比較に使用する演算子を次の表に示します。
| 演算子を用いた条件式 | 判定 | testコマンドまたは[[]]での使用可否 | letコマンドまたは(())での使用可否 |
|---|---|---|---|
| -n 文字列 | 文字列の長さが1文字以上の場合は真。 | ○ | × |
| -z 文字列 | 文字列の長さが0の場合は真。 | ○ | × |
| -o 文字列 | 文字列が現在有効に設定されているシェルオプションの文字列と一致する場合は真。シェルオプションの文字列については,「表5-34 setコマンドで設定するシェルオプション」の「名称」を参照してください。 | ○ | × |
| 文字列 = pattern | 文字列とpatternが一致する場合は真。 | ○ | × |
| 文字列 == pattern | 文字列とpatternが一致する場合は真。 | ○ | × |
| 文字列 != pattern | 文字列とpatternが不一致の場合は真。 | ○ | × |
| 文字列1 < 文字列2 | 文字列1と文字列2をASCIIコード順に比較します。文字列1より文字列2が大きい場合は真。 | ○※ | × |
| 文字列1 > 文字列2 | 文字列1と文字列2をASCIIコード順に比較します。文字列1より文字列2が小さい場合は真。 | ○※ | × |
- (凡例)
- ○:使用できます。
- ×:使用できません。
- 注※
- [[ ]]で使用できます。testコマンドでは使用できません。
比較する文字列にはスペースなどが含まれる場合があるため,”(ダブルクォーテーション)で囲むことを推奨します。使用例を次に示します。
str1="aaa" str2="bbb" test "$str1" == "$str2" [[ "$str1" == "$str2" ]] |
比較する文字列には*,?,[…]のワイルドカードが指定できます。ただし,testコマンドではワイルドカードを使用できません。また,ワイルドカードを使用した文字列を”(ダブルクォーテーション)で囲んだ場合,ワイルドカードが持つ意味が無効化されてしまうため,注意してください。使用例を次に示します。
str1="adsh" str2="ads?" str3="ad*" [[ "$str1" == "$str2" ]] ←ワイルドカードが無効。文字列"ads?"の比較をする [[ $str1 != $str3 ]] ←ワイルドカードが有効 |
[[ ]]による文字列比較の使用例を次に示します。ワイルドカードは,*,?,[…]が指定できます。
if [[ abc == ab* ]]; then
echo TRUE
fi
|
ファイルの形式や権限などの属性を評価する場合に使用する演算子を次の表に示します。
| 演算子を用いた条件式 | 判定 | testコマンドまたは[[]]での使用可否 | letコマンドまたは(())での使用可否 |
|---|---|---|---|
| -a file | fileが存在する場合は真。 | ○ | × |
| -b file | fileが存在し,ブロック型デバイスの場合は真。 | ○ | × |
| -c file | fileが存在し,キャラクタ型デバイスの場合は真。 | ○ | × |
| -d file | fileが存在し,ディレクトリの場合は真。 | ○ | × |
| -e file | fileが存在する場合は真。 | ○ | × |
| -f file | fileが存在し,レギュラーファイルの場合は真。 | ○ | × |
| -g file | fileが存在し,setgidビットがセットされている場合は真。 | ○ | × |
| -h file | fileが存在し,シンボリックリンクの場合は真。 | ○ | × |
| -k file | fileが存在し,スティッキービットがセットされている場合は真。 | ○ | × |
| -p file | fileが存在し,パイプファイルの場合は真。 | ○ | × |
| -r file | fileが存在し,カレントプロセスから読み込み可能なときは真。 | ○ | × |
| -s file | fileが存在し,ファイルサイズが1以上の場合は真。 | ○ | × |
| -t fd | 端末をオープンしているfdの場合は真。※3 | ○ | × |
| -u file | fileが存在し,setuidビットがセットされている場合は真。 | ○ | × |
| -w file | fileが存在し,カレントプロセスから書き込み可能なときは真。 | ○ | × |
| -x file | fileが存在し,カレントプロセスから実行可能なときは真。 | ○ | × |
| -G file | fileが存在し,fileが属するグループが呼び出し元のプロセスの実効グループIDと一致している場合は真。 | ○ | × |
| -L file | fileが存在し,シンボリックリンクの場合は真。 | ○ | × |
| -O file | fileが存在し,所有者がプロセスの有効ユーザーIDの場合は真。※2 | ○ | × |
| -S file | fileが存在し,ソケットの場合は真。 | ○ | × |
| file1 -ef file2 | file1とfile2が存在し,file1とfile2の実体が同じ(シンボリックリンク先が同じまたはハードリンク先が同じ)場合は真。 | ○ | × |
| file1 -nt file2 | file1とfile2が存在し,file1の更新日付がfile2よりも新しい場合は真。 | ○ | × |
| file1 -ot file2 | file1とfile2が存在し,file1の更新日付がfile2よりも古い場合は真。 | ○ | × |
| -H file | 常に偽。 | ○ | × |
- (凡例)
- ○:使用できます。
- ×:使用できません。
ファイル属性の使用例を次に示します。
FILE="$HOME/script/test.ash" if [[ -a $FILE ]]; then echo "$FILE exists." else echo "$FILE does not exist." fi |
論理演算で評価する場合に使用する演算子を次の表に示します。
| 演算子を用いた条件式 | 判定 | testコマンドまたは[[]]での使用可否 | letコマンドまたは(())での使用可否 |
|---|---|---|---|
| expr1 -a expr2 | expr1とexpr2の結果が両方とも真の場合,真。 | ○※ | × |
| expr1 -o expr2 | expr1とexpr2の結果がどちらか一方でも真の場合,真。 | ○※ | × |
| expr1 && expr2 | expr1とexpr2の結果が両方とも真の場合,真。 | ○ | ○ |
| expr1 || expr2 | expr1とexpr2の結果がどちらか一方でも真の場合,真。 | ○ | ○ |
| ! expr | exprの結果が偽の場合,真。 | ○ | ○ |
- (凡例)
- ○:使用できます。
- ×:使用できません。
- 注※
- testコマンドで使用できます。[[ ]]は使用できません。
論理演算の使用例を次に示します。
DIR="/tmp" FILE="/tmp/test.ash" a=2 b=4 if test -d $DIR -a -a $FILE then echo "$DIR is directory and $FILE exists." else echo "$DIR is not directory or $FILE does not exist." fi while ((a*0 || b-3)); do echo LOOP let b-=1 done |
ただし,testコマンドで論理演算子「&&」および「||」を使用する場合は,次のように記述してください。
a=1
b=2
c=3
if test "$a" == 1 && test "$b" == 2; then
echo "True"
else
echo "False"
fi
if test "$a" != "$b" || test "$a" != "$c"; then
echo "True"
else
echo "False"
fi
|
if-elseの省略記法である三項演算子を使用できます。JP1/Advanced Shellで使用できる三項演算子を次の表に示します。
表5-25 JP1/Advanced Shellで使用できる三項演算子
| 演算子を用いた条件式 | 判定 | testコマンドまたは[[]]での使用可否 | letコマンドまたは(())での使用可否 |
|---|---|---|---|
| expr1?expr2: expr3 | expr1の結果が真であればexpr2の結果,偽であればexpr3の結果を返します。 | × | ○ |
- (凡例)
- ○:使用できます。
- ×:使用できません。
三項演算子の使用例を次に示します。
VAR1=3 VAR2=2 ANSWER=0 ((ANSWER=VAR1>VAR2?8+VAR1:8*VAR2)) echo $ANSWER |