Shell における角括弧(単角括弧と二重角括弧を含む)は、いくつかの条件のテストに使用できます:

  • 算術比較、例えば変数が0であるかどうか、[ $var -eq 0 ]。
  • ファイル属性のテスト、例えばファイルが存在するかどうか、[ -e $var ]、ディレクトリかどうか、[ -d $var ]。
  • 文字列比較、例えば2つの文字列が同じかどうか、[[ $var1 = $var2 ]]。

[] はしばしば test コマンドで代用できます。後述します。

算术比较

変数または値に対して算術条件判断を行う:

[ $var -eq 0 ]  # 当 $var 等于 0 时,返回真
[ $var -ne 0 ]  # 当 $var 不等于 0 时,返回真

注意すべき点として、[ と ] とオペランドの間には必ずスペースが必要です。そうでないとエラーになります。例えば以下のようにするとエラーになります:

[$var -eq 0 ]  或 [ $var -ne 0] 

その他の比較演算子:

操作符 意义
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于

-a (and) または -o (or) を使用して複数の条件を組み合わせてテストできます:

[ $var1 -ne 0 -a $var2 -gt 2 ]  # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ]  # 使用逻辑或 -o

ファイルシステム属性テスト

異なる条件フラグを使用して、異なるファイルシステム属性をテストします。

操作符 意义
[ -f $file_var ] 変数 $file_var が正常なファイルパスまたはファイル名(file)である場合、真を返します
[ -x $var ] 変数 $var が含むファイルが実行可能(execute)である場合、真を返します
[ -d $var ] 変数 $var が含むファイルがディレクトリ (directory) であれば真を返す
[ -e $var ] 変数 $var が含むファイルが存在する(exist)場合、真を返します
[ -c $var ] 変数 $var が含むファイルがキャラクタデバイスファイルのパス(character)である場合、真を返します
[ -b $var ] 変数 $var が含むファイルがブロックデバイスファイルのパス(block)である場合、真を返します
[ -w $var ] 変数 $var が含むファイルが書き込み可能(write)である場合、真を返します
[ -r $var ] 変数 $var が含むファイルが読み取り可能(read)である場合、真を返します
[ -L $var ] 変数 $var が含むものがシンボリックリンク(link)である場合、真を返します

使用方法は以下の通り:

fpath="/etc/passwd"
if [ -e $fpath ]; then
  echo File exits;
else
  echo Does not exit;
fi

字符串比较

文字列比較を行う際は、二重角括弧 [[ ]] を使用するのが最善です。単角括弧はエラーを引き起こす可能性があるため、避けるのが賢明です。

2つの文字列が同じかどうかを確認する:

[[ $str1 = $str2 ]]

str1 が str2 と等しい場合、真を返します。つまり、str1 と str2 に含まれるテキストは同じです。単一の等号は二重等号に置き換えることもできます。つまり、上記の文字列比較は [[ $str1 == $str2 ]] と同等です。

= の前後にはスペースがあることに注意してください。スペースを忘れると、比較ではなく代入文になってしまいます。

文字列のその他の比較ケース:

操作符 意义
[[ $str1 != $str2 ]] str1 と str2 が異なる場合、真を返します
[[ -z $str1 ]] str1 が空文字列である場合、真を返します
[[ -n $str1 ]] str1 が非空文字列である場合、真を返します

論理演算子 && と || を使用すると、複数の条件を簡単に組み合わせられます。例えば:

str1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
  echo str1 is nonempty and str2 is empty string.
fi

test コマンドでも条件判定を実行できます。test を使用すると括弧を多用せずに済みます。[] 内のテスト条件は test でも実行できます。

if [ $var -eq 0 ]; then echo "True"; fi

等价于:

if test $var -eq 0; then echo "True"; fi

作者:liuchengxu_

原文:https://blog.csdn.net/simple_the_best/article/details/75915767