サーチ…


構文

  • [[-OP $ファイル名]]
  • [[$ file1 -OP $ file2]]
  • [[-z $ string]]
  • [[-n $ string]]
  • [["$ string1" == "$ string2"]]
  • [["$ string1" == $パターン]]

備考

[[ … ]]構文は、bashの組み込みの条件式を取り囲んでいます。ブラケットの両側にスペースが必要であることに注意してください。

条件式では、単項演算子と二項演算子を使用して、文字列、整数、およびファイルのプロパティをテストできます。また、論理演算子&&||使用することもできます。そして!

ファイルの比較

if [[ $file1 -ef $file2 ]]; then
  echo "$file1 and $file2 are the same file"
fi

「同じファイル」とは、そのうちの1つを変更すると、他のファイルに影響を与えることを意味します。 2つのファイルは、たとえハードリンクであったり、同じターゲットとのシンボリックリンクであったり、他のファイルを指し示すシンボリックリンクであったりしても、名前が異なっていても同じ名前になります。

2つのファイルが同じ内容を持っていても、別々のファイルである場合(つまり、一方のファイルを変更しても他方のファイルに影響を与えない場合)、- -efは異なるファイルとして報告します。 2つのファイルをバイトcmpに比較する場合は、 cmpユーティリティを使用します。

if cmp -s -- "$file1" "$file2"; then
  echo "$file1 and $file2 have identical contents"
else
  echo "$file1 and $file2 differ"
fi

人間が判読可能なテキストファイル間の相違点の一覧を作成するには、 diffユーティリティを使用します。

if diff -u "$file1" "$file2"; then
  echo "$file1 and $file2 have identical contents"
else
  : # the differences between the files have been listed
fi

ファイルアクセステスト

if [[ -r $filename ]]; then
  echo "$filename is a readable file"
fi
if [[ -w $filename ]]; then
  echo "$filename is a writable file"
fi
if [[ -x $filename ]]; then
  echo "$filename is an executable file"
fi

これらのテストでは、アクセス許可と所有権を考慮して、スクリプト(またはスクリプトから起動されたプログラム)がファイルにアクセスできるかどうかを判断します。

競合状態(TOCTOU)に注意してください:テストが成功したという理由だけで、それが次の行でまだ有効であるとは限りません。通常は、ファイルにアクセスし、エラーを処理してからテストしてから、その間にファイルが変更された場合にエラーを処理する必要があります。

数値比較

数値比較では、 -eq演算子とフレンドを使用します

if [[ $num1 -eq $num2 ]]; then
  echo "$num1 == $num2"
fi
if [[ $num1 -le $num2 ]]; then
  echo "$num1 <= $num2"
fi

6つの数値演算子があります。

  • -eq equal
  • -neは等しくない
  • -le以下
  • -lt以下
  • -ge大きいか等しい
  • -gtより大きい

[[ … ]]内の<および>演算子は、数値ではなく文字列を比較することに注意してください。

if [[ 9 -lt 10 ]]; then
  echo "9 is before 10 in numeric order"
fi
if [[ 9 > 10 ]]; then
  echo "9 is after 10 in lexicographic order"
fi

2辺は、10進数で書かれた数字でなければなりません(または先頭にゼロが付いた8進数)。あるいは、C / Java / ...のような構文で整数計算を実行する((…))算術式構文を使用します。

x=2
if ((2*x == 4)); then
  echo "2 times 2 is 4"
fi
((x += 1))
echo "2 plus 1 is $x"

文字列の比較とマッチング

文字列比較では、 引用符付きの文字列の間に==演算子が使用されます。 !=演算子は比較を否定します。

if [[ "$string1" == "$string2" ]]; then
  echo "\$string1 and \$string2 are identical"
fi
if [[ "$string1" != "$string2" ]]; then
  echo "\$string1 and \$string2 are not identical"
fi

右側が引用符で囲まれていない場合は、 $string1が照合されるワイルドカードパターンです。

string='abc'
pattern1='a*'
pattern2='x*'
if [[ "$string" == $pattern1 ]]; then
  # the test is true
  echo "The string $string matches the pattern $pattern"
fi
if [[ "$string" != $pattern2 ]]; then
  # the test is false
  echo "The string $string does not match the pattern $pattern"
fi

<>演算子は、文字列を辞書順に比較します(文字列の場合、それほど等しいか等しいか等しい演算子はありません)。

空文字列に対する単項テストがあります。

if [[ -n "$string" ]]; then
  echo "$string is non-empty"
fi
if [[ -z "${string// }" ]]; then
  echo "$string is empty or contains only spaces"
fi
if [[ -z "$string" ]]; then
  echo "$string is empty"
fi

上記の-zチェックは、 $stringが設定されていないか、空の文字列に設定されていることを意味します。空と未設定を区別するには、次のようにします。

if [[ -n "${string+x}" ]]; then
    echo "$string is set, possibly to the empty string"
fi
if [[ -n "${string-x}" ]]; then
    echo "$string is either unset or set to a non-empty string"
fi
if [[ -z "${string+x}" ]]; then
    echo "$string is unset"
fi
if [[ -z "${string-x}" ]]; then
    echo "$string is set to an empty string"
fi

xは任意である。またはテーブル形式で

                        +-------+-------+-----------+
            $string is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [[ -z ${string} ]]    | true  | true  | false     |
| [[ -z ${string+x} ]]  | true  | false | false     |
| [[ -z ${string-x} ]]  | false | true  | false     |
| [[ -n ${string} ]]    | false | false | true      |
| [[ -n ${string+x} ]]  | false | true  | true      |
| [[ -n ${string-x} ]]  | true  | false | true      |
+-----------------------+-------+-------+-----------+

代わりに、caseステートメントで状態をチェックすることもできます。

case ${var+x$var} in
  (x) echo empty;;
  ("") echo unset;;
  (x*[![:blank:]]*) echo non-blank;;
  (*) echo blank
esac

[:blank:]はロケール固有の水平スペーシング文字(タブ、スペースなど)です。

ファイルタイプのテスト

-e条件演算子は、ファイルが存在するかどうかをテストします(すべてのファイルタイプ:ディレクトリなど)。

if [[ -e $filename ]]; then
  echo "$filename exists"
fi

特定のファイルタイプのテストもあります。

if [[ -f $filename ]]; then
  echo "$filename is a regular file"
elif [[ -d $filename ]]; then
  echo "$filename is a directory"
elif [[ -p $filename ]]; then
  echo "$filename is a named pipe"
elif [[ -S $filename ]]; then
  echo "$filename is a named socket"
elif [[ -b $filename ]]; then
  echo "$filename is a block device"
elif [[ -c $filename ]]; then
  echo "$filename is a character device"
fi
if [[ -L $filename ]]; then
  echo "$filename is a symbolic link (to any file type)"
fi

シンボリックリンクでは、 -L 、これらのテストはターゲットに適用され、壊れたリンクに対してはfalseが返されます。

if [[ -L $filename || -e $filename ]]; then
  echo "$filename exists (but may be a broken symbolic link)"
fi

if [[ -L $filename && ! -e $filename ]]; then
  echo "$filename is a broken symbolic link"
fi

コマンドの終了ステータスのテスト

終了ステータス0:成功
0以外の終了ステータス:失敗

コマンドの終了ステータスをテストするには:

if command;then
    echo 'success'
else
    echo 'failure'
fi

ライナーテスト1回

次のようなことができます:

[[ $s = 'something' ]] && echo 'matched' || echo "didn't match"
[[ $s == 'something' ]] && echo 'matched' || echo "didn't match"
[[ $s != 'something' ]] && echo "didn't match" || echo "matched"
[[ $s -eq 10 ]] && echo 'equal' || echo "not equal"
(( $s == 10 )) && echo 'equal' || echo 'not equal'

終了ステータスの1つのライナーテスト:

command && echo 'exited with 0' || echo 'non 0 exit'
cmd && cmd1 && echo 'previous cmds were successful' || echo 'one of them failed'
cmd || cmd1 #If cmd fails try cmd1


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow