サーチ…
構文
- [[-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