こんにちは。よっしーです(^^)
今日は、bashにおけるシングルブラケットとダブルブラケットの違いについてご紹介します。
背景
bashにおけるシングルブラケットとダブルブラケットの違いについて調査する機会があったので、そのときの内容を備忘として残しました。
この記事のソースは下記のサイトにアップしています。
実行環境について
実行環境は下記の記事を参考にお願いします。
概要
Bashにおけるシングルブラケット [ ... ]
とダブルブラケット [[ ... ]]
は、条件式の評価に使用される構文です。これらは似ているようでいて、いくつかの重要な違いがあります。
シングルブラケット [ ... ]
式を評価するために Unix および Linux で常に使用できるシェル組み込みコマンドです。下位互換性と POSIX 準拠のためにまだ存在しています。
シンブルブラケットはシェルの組み込みコマンドです。
root@60ef16ef0615:/work# type [
[ is a shell builtin
- 単純な文字列比較:
[ ... ]
は、基本的な条件式の評価に使用されます。- 文字列の比較において、
=
や!=
を使用します。
if [ "$var" = "value" ]; then
# 条件が真の場合の処理
fi
- 数値比較:
[ ... ]
は数値の比較も行えます。-eq
(等しい)、-ne
(等しくない)、-lt
(より小さい)、-le
(以下)、-gt
(より大きい)、-ge
(以上)などの演算子が使用できます。
if [ "$num1" -eq "$num2" ]; then
# 条件が真の場合の処理
fi
ダブルブラケット [[ ... ]]
シェル スクリプトのテストでの使用を容易にする拡張機能として Korn シェルに導入されました。 これはシンブルブラケットの便利な代替手段と考えることができます。
Bash や zsh などの多くのシェルで利用できます。ただし、二重括弧は POSIX に準拠していません。
ダブルブラケットは、シェルのキーワードです。
root@60ef16ef0615:/work# type [[
[[ is a shell keyword
- 豊富な論理演算子:
[[ ... ]]
はより豊富な論理演算子をサポートします。&&
(AND)、||
(OR)などが利用可能です。
if [[ "$var1" == "value1" && "$var2" == "value2" ]]; then
# 条件が真の場合の処理
fi
- 文字列比較:
- 文字列の比較において、
==
や!=
を使用します。また、<
や>
なども文字列の辞書順比較に使用できます。
if [[ "$str1" == "abc" ]]; then
# 条件が真の場合の処理
fi
- 拡張されたパターンマッチング:
[[ ... ]]
では、拡張されたパターンマッチングが利用できます。*
や?
などのワイルドカードを使用できます。
if [[ "$str" == *pattern* ]]; then
# 条件が真の場合の処理
fi
総じて言えることは、通常の条件式や数値比較などの基本的な用途であれば [ ... ]
を使用し、より高度な条件式や文字列比較、存在チェックなどが必要な場合は [[ ... ]]
を使用すると良いでしょう。[[ ... ]]
は Bash 固有の拡張機能なので、他のシェル環境で動作するスクリプトを書く場合は [ ... ]
を選ぶことが一般的です。
比較演算子
root@60ef16ef0615:/work# [[ 1 < 2 ]] && echo “1 is less than 2”
“1 is less than 2”
root@60ef16ef0615:/work# [ 1 < 2 ] && echo “1 is less than 2”
bash: 2: No such file or directory
# エスケープすると成功する
[ 1 \< 2 ] && echo “1 is less than 2”
“1 is less than 2”
ブール演算子
root@60ef16ef0615:/work# [[ 3 -eq 3 && 4 -eq 4 ]] && echo 'Numbers are equal'
Numbers are equal
root@60ef16ef0615:/work# [ 3 -eq 3 -a 4 -eq 4 ] && echo 'Numbers are equal'
Numbers are equal
グループ化
root@60ef16ef0615:/work# [[ 3 -eq 3 && (2 -eq 2 && 1 -eq 1) ]] && echo 'Parentheses can be used'
Parentheses can be used
root@60ef16ef0615:/work# [ 3 -eq 3 -a (2 -eq 2 -a 1 -eq 1) ] && echo 'Parentheses can be used'
bash: syntax error near unexpected token `('
# エスケープする
root@60ef16ef0615:/work# [ 3 -eq 3 -a \( 2 -eq 2 -a 1 -eq 1 \) ] && echo 'Parentheses can be used'
Parentheses can be used
おわりに
今日は、bashにおけるシングルブラケットとダブルブラケットの違いについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント