2008/06/02

大括號的擴展 Bash Brace Expansion

本文大致是翻譯自bash 大括號的擴展

Bash 的大括號擴展非常有用,常見場合是命令列或 shell script 中用於產生序列字串。語法不難明白,底下用實例解釋。


{aa,bb,cc,dd} => aa bb cc dd
{0..12} => 0 1 2 3 4 5 6 7 8 9 10 11 12
{3..-2} => 3 2 1 0 -1 -2
{a..g} => a b c d e f g
{g..a} => g f e d c b a


大括號的擴展也可以在字串中:

a{0..3}b => a0b a1b a2b a3b

也可以是巢狀的:

{a,b{1..3},c} => a b1 b2 b3 c

為瞭解釋方便,底下舉一個用大括號擴展的片段:
for i in {0..19}
do
echo $i
done


其相當的 for 迴圈寫法為:
for (( i = 0; i <>


也可以用 while 來表達:
while [[ $i -lt 20 ]]
do
echo $i
let i++
done


再用一個 seq 改寫 for 迴圈的例子說明:
for i in $(seq 0 19)
do
echo $i
done


事實上,上面的例子都只能用在數字的情況,若是非數字的部份則無法採用同樣的方式,例如:
for i in {a..z}
do
echo $i
done

個人比較常用於長路徑時使用,例如:
cp /a/long/path/A /a/long/path/B TARGET
寫成
cp /a/long/path/{A,B} TARGET

通常可以少打很多字

在寫 shell script 中,有時反而希望 BASH 不要解釋這樣的大括號擴展,可以用 set +B來抑制,也就是預設是 set -B來啟用

搭配中括號的擴展也會對有效字串的產生非常有幫助,請自行搭配使用。

0 意見: