各shellはさまざまな演算子をサポートしています。 この記事では、Bourne shell(デフォルトのshell)について詳しく説明します。
以下の演算子について説明します。
- 算術演算子
- 関係演算子
- ブール演算子
- 文字列演算子
- ファイルテスト操作
Bourne Shellには元々、単純な算術演算を実行するメカニズムがありませんが、外部プログラムawkまたはexprを使用します。
次の実例は、2つの数値の合算を示しています。
#!/bin/sh
val=`expr 2 + 2`
echo "Total value : $val"
上記のスクリプトは次の結果を生成します。
Total value : 4
追加する場合には、以下の点を考える必要があります。
- 演算子と式の間にはスペースが必要です。 例えば、2 +2は正しくありません。2+ 2と記述する必要があります。
- 完全な式は、バックティックと呼ばれる「‘ ‘」の間に配置する必要があります。
目次
算術演算子
Bourne Shellは、次の算術演算子をサポートしています。
仮に、変数a
が10を保持し、変数b
が20を保持します。
演算子 | 説明 | 実例 |
+(加算) | 演算子の任意側に値を追加します。 | expr $a + $b は30にイコール |
-(減算) | 左のオペランドから右のオペランドを減算します。 | expr $a - $b は-10を与えます |
*(乗算) | 演算子の両側の値を乗算します | expr $a * $b は200を取得します |
/(除算) | 左のオペランドを右のオペランドで除算します。 | expr $b / $a は2を取得します |
%(余数) | 左のオペランドを右のオペランドで除算し、余りを返します。 | expr $b % $a は0を与えます |
=(割り当て) | 左のオペランドに右のオペランドを割り当てます。 | a = $b は、bの値をaに割り当てます |
==(イコール) | 2つの数値を比較し、イコールの場合はtrueを返します。 | [ $a == $b ]はfalseを返します。 |
!=(イコールではない) | 2つの数値を比較し、イコールではない場合はtrueを返します。 | [ $a != $b ]はtrueを返します。 |
すべての条件式は、周りにスペースを入れた角かっこで囲む必要があることを理解することが非常に重要です。例えば、** [ $a == $b ] はTrueであり、[$a==$b]**は正しくありません。
すべての算術演算は長整数で実行されます。
関係演算子
Bourne Shellは、以下の数値固有の関係演算子をサポートしています。 これらの演算子は、値が数値でない限り、文字列値には適用されません。
例えば、以下の演算子は、「十」ト「二十」の関係ではなく、「10」と「20」、または「“10”」と「“20”」の関係をチェックします。
仮に、変数a
が10を保持し、変数b
が20を保持します。
演算子 | 説明 | 実例 |
-eq | 2つのオペランドの値が等しいかどうかを確認します。等しい場合、条件は真になります。 | [$ a -eq $ b ] はFalseです。 |
-ne | 2つのオペランドの値が等しいかどうかを確認します。値が等しくない場合は、条件が真になります。 | [$ a -ne $ b ]はTrueです。 |
-gt | 左のオペランドの値が右のオペランドの値よりも大きいかどうかを確認します。大きい場合は、条件が真になります。 | [$ a -gt $ b ]はFalseです。 |
-lt | 左のオペランドの値が右のオペランドの値よりも小さいかどうかを確認します。小さい場合は、条件が真になります。 | [$ a -lt $ b ]はTrueです。 |
-ge | 左のオペランドの値が右のオペランドの値以上であるかどうかを確認します。大きい場合は、条件が真になります。 | [$ a -ge $ b ]はFalseです。 |
-le | 左のオペランドの値が右のオペランドの値以下であるかどうかを確認します。以下の場合、条件は真になります。 | [$ a -le $ b ]はTrueです。 |
すべての条件式は角かっこで囲み、その周りにスペースを入れる必要があることを理解することが重要です。例えば、[ $a <= $b ]
は正しく、** [$a <= $b]**は正しくありません。
ブール演算子
Bourne Shellは、以下のブール演算子をサポートしています。
仮に、変数a
が10を保持し、変数b
が20を保持します。
演算子 | 説明 | 実例 |
! | 論理否定です。 これにより、実際の状態がエラーになり、その逆もそうです。 | [!false ]はtrueです。 |
-o | 論理ORです。 オペランドの1つがtrueの場合、条件はtrueです。 | [ $a -lt 20 -o $b -gt 100 ]はTrueです。 |
-a | これは論理積(AND)です。 両方のオペランドがtrueの場合、条件はtrueです。それ以外の場合は、falseです。 | [ $a -lt 20 -a $b -gt 100 ]はFalseです。 |
文字列演算子
Bourne Shellは、以下の文字列演算子をサポートしています。
仮に、変数a
が「abc」を保持し、変数b
が「efg」を保持します。
演算子 | 説明 | 実例 |
= | 2つのオペランドの値が等しいかどうかを確認します。等しい場合、条件は真になります。 | [ $a = $b ]はFalseです。 |
!= | 2つのオペランドの値が等しいかどうかを確認します。値が等しくない場合は、条件が真になります。 | [ $a != $b ]はTrueです。 |
-z | 指定された文字列オペランドのサイズがゼロかどうかをチェックします。長さがゼロの場合はtrueを返します。 | [ -z $a ]はFalseです。 |
-n | 指定された文字列オペランドのサイズがゼロ以外であるかどうかを確認します。長さがゼロではない場合は、trueを返します。 | [ -n $a ]はFalseではありません。 |
空白 | strが空の文字列でないかどうかを確認します。空の場合は、falseを返します。 | [ $a ]はFalseではありません。 |
ファイルテスト演算子
Unixファイルに関連するさまざまな属性をテストするために使用できる演算子がいくつかあります。
仮に、変数ファイルに既存のファイル名「test」があり、そのサイズが100バイトであり、読み取り、書き込み、および実行のアクセス許可があります。
演算子 | 説明 | 実例 |
-b ファイル名 | ファイルがブロック特殊ファイルであるかどうかを確認します。そうである場合は、条件がtrueになります。 | [ -b $file ]はFalseです。 |
-c ファイル名 | ファイルが文字特殊ファイルかどうかを確認してください。そうである場合は、条件がtrueになります。 | [ -c $file ]はFalseです。 |
-d ファイル名 | ファイルがディレクトリであるかどうかを確認します。ディレクトリである場合は、条件がtrueになります。 | [ -d $file ]はFalseです。 |
-f ファイル名 | [ -f $file ]はTrueです。 | |
-g ファイル名 | ファイルの設定グループID(SGID)ビットが設定されているかを確認します。設定されている場合は条件がtrueになります。 | [ -g $file ]はFalseです。 |
-k ファイル名 | ファイルにスティッキービットが設定されているかどうかを確認します。設定されている場合は、条件がtrueになります。 | [ -k $file ]はFalseです。 |
-p ファイル名 | ファイルが名前付きパイプであるかどうかを確認します。名前付きパイプである場合は、条件がtrueになります。 | [ -p $file ]はFalseです。 |
-t ファイル名 | ファイル記述子が開いていて端末に関連付けられているかどうかを確認します。開いている場合は、条件がtrueになります。 | [ -t $file ]はFalseです。 |
-u ファイル名 | ファイルに「SUID(Set User ID)」が設定されているかを確認します。設定されている場合は、条件がtrueになります。 | [ -u $file ]はFalseです。 |
-r ファイル名 | ファイルが読み取り可能かどうかを確認します。読み取り可能であれば、条件はtrueになります。 | [ -r $file ]はTrueです。 |
-w ファイル名 | ファイルが書き込み可能かどうかを確認します。書き込み可能である場合は、条件がtrueになります。 | [ -w $file ]はTrueです。 |
-x ファイル名 | ファイルが実行可能かどうかを確認します。実行可能であれば、条件はtrueになります。 | [ -x $file ]はTrueです。 |
-s ファイル名 | ファイルサイズが0より大きいかどうかを確認します。大きい場合は、条件がtrueになります。 | [ -s $file ]はTrueです。 |
-e ファイル名 | ファイルが存在するかどうかを確認します。ファイルがディレクトリであるが存在する場合でもtrueであることです。 | [ -e $file ]はTrueです。 |
コメントを残す