Bash での角括弧、丸括弧、中括弧の使い方、およびそれらの二重形式と単一形式の違いがよくわかりません。 明確な説明はありますか?
ベストアンサー1
Bash では、test
および は[
シェルの組み込み関数です。
の二重括弧 [[
シェルのキーワードである を使用すると、追加の機能が有効になります。たとえば、andの代わりに&&
and を使用できます。また、正規表現マッチング演算子 もあります。||
-a
-o
=~
また、簡単なテストでは、二重の角括弧の方が単一の角括弧よりもかなり速く評価されるようです。
$ time for ((i=0; i<10000000; i++)); do [[ "$i" = 1000 ]]; done
real 0m24.548s
user 0m24.337s
sys 0m0.036s
$ time for ((i=0; i<10000000; i++)); do [ "$i" = 1000 ]; done
real 0m33.478s
user 0m33.478s
sys 0m0.000s
中括弧は変数名を区切るだけでなく、パラメータ拡張次のようなことが可能になります:
変数の内容を切り捨てる
$ var="abcde"; echo ${var%d*} abc
同様の置換を行う
sed
$ var="abcde"; echo ${var/de/12} abc12
デフォルト値を使用する
$ default="hello"; unset var; echo ${var:-$default} hello
その他
また、中括弧の展開により、通常はループ内で反復処理される文字列のリストが作成されます。
$ echo f{oo,ee,a}d
food feed fad
$ mv error.log{,.OLD}
(error.log is renamed to error.log.OLD because the brace expression
expands to "mv error.log error.log.OLD")
$ for num in {000..2}; do echo "$num"; done
000
001
002
$ echo {00..8..2}
00 02 04 06 08
$ echo {D..T..4}
D H L P T
先頭のゼロと増分機能は Bash 4 より前では利用できなかったことに注意してください。
ブレース拡張について思い出させてくれたgboffiに感謝します。
二重括弧は算術演算:
((a++))
((meaning = 42))
for ((i=0; i<10; i++))
echo $((a + b + (14 * c)))
また、整数変数や配列変数のドル記号を省略したり、演算子の前後にスペースを入れて読みやすくしたりすることもできます。
裸の二重括弧((
...))
囲まれた式の値がゼロ以外の場合は 0 (true) を返し、それ以外の場合は 1 (false) を返します。
$ ((2 + 3 - 5)) || echo "last command returned 1"
last command returned 1
$ ((2 + 3 - 7)) && echo "last command returned 0"
last command returned 0
単一の括弧は、配列インデックス:
array[4]="hello"
element=${array[index]}
右側の(ほとんど/すべての?)配列参照には中括弧が必要です。
ephemient さんのコメントで、括弧はサブシェルにも使用されることを思い出しました。また、括弧は配列の作成にも使用されます。
array=(1 2 3)
echo ${array[1]}
2