Loose-Info.com
Last Update 2022/08/13
TOP - 各種テスト - bash - 展開

展開


テスト項目

(01) ブレース展開

(02) チルダ展開

(03) パラメータ展開
${parameter}
${parameter:-word} ${parameter:=word} ${parameter:+word} ${parameter:?word}
${parameter:offset} ${parameter:offset:length}
${!prefix*} ${!prefix@}
${!name[@]} ${!name[*]}
${#parameter}
${parameter#word} ${parameter##word}
${parameter%word} ${parameter%%word}
${parameter/pattern/string}
${parameter^pattern} ${parameter^^pattern} ${parameter,pattern} ${parameter,,pattern}
${parameter@operator}

(04) コマンド置換

(05) 算術展開

(06) 単語分割

(07) パス名展開


(01) ブレース展開


実行結果(1)
$ echo {犬,猫}が{走って,座って,寝て}いる 犬が走っている 犬が座っている 犬が寝ている 猫が走っている 猫が座っている 猫が寝ている 全て組み合わせが出力される

実行結果(2)
$ echo FileNo{0..9} FileNo0 FileNo1 FileNo2 FileNo3 FileNo4 FileNo5 FileNo6 FileNo7 FileNo8 FileNo9 $ echo FileNo{00..10} FileNo00 FileNo01 FileNo02 FileNo03 FileNo04 FileNo05 FileNo06 FileNo07 FileNo08 FileNo09 FileNo10 0から9まで1つづつ増加させた整数値に展開 整数値の前に0をつけた場合は必要に応じてゼロパディングを行い数値幅を強制

実行結果(3)
$ echo FileNo{00..10..2} FileNo00 FileNo02 FileNo04 FileNo06 FileNo08 FileNo10 「..」と整数値を追加することにより増分値を指定

(02) チルダ展開


実行結果(1)
$ echo ~testusr /home/testusr <--- 「~」+「ログイン名」の場合、ログイン名に関連するホームディレクトリ $ echo ~root /root $ echo ~test ~test <--- 「ログイン名」が無効な場合、置換されない $ echo ~ /home/testusr <--- 「ログイン名」が空の場合、シェル変数HOMEの値に展開 $ echo $HOME /home/testusr

実行結果(2)
$ cd .. $ cd testdir3 $ echo $PWD /home/testusr/testdir3 $ echo $OLDPWD /home/testusr $ echo ~+ /home/testusr/testdir3 <--- 「~+」はシェル変数PWDの値に置換 $ echo ~- /home/testusr <--- 「~-」はシェル変数OLDPWDの値に置換

(03) パラメータ展開


サンプルスクリプトファイル(1)
sample.sh
#!/bin/bash samplevar1=1 samplevar2="samplevar1" echo "ブレース無しの記述" echo "\$samplevar1 = $samplevar1" echo echo "ブレース有りの記述" echo "\${samplevar1} = ${samplevar1}" echo echo "隣接する文字列が存在(ブレース無し)" echo "\$samplevar12345 = $samplevar12345" echo "\$10 = $10" echo "隣接する文字列が存在(ブレース有り)" echo "\${samplevar1}2345 = ${samplevar1}2345" echo "\${10} = ${10}" echo echo "変数の値を変数名として使用" echo "\${!samplevar2} = ${!samplevar2}"

実行結果(1)
$ ./sample.sh 0 1 2 3 4 5 6 7 8 9 ブレース無しの記述 $samplevar1 = 1 <--- 変数「samplevar1」の値を展開 ブレース有りの記述 ${samplevar1} = 1 <--- 変数「samplevar1」の値を展開 隣接する文字列が存在(ブレース無し) $samplevar12345 = <--- ブレースが無いためsamplevar1では区切られずせっていされていない変数と解釈される $10 = 00 隣接する文字列が存在(ブレース有り) ${samplevar1}2345 = 12345 <--- ブレースにより変数名の区切り位置が明確になり、samplevar1が展開される ${10} = 9 変数の値を変数名として使用 ${!samplevar2} = 1 <--- samplevar2を展開したsamplevar1を変数名として展開

サンプルスクリプトファイル(2)
sample.sh
#!/bin/bash samplevar1="abc" samplevar2="" echo "例 : \${parameter:-word}" echo "${samplevar1:-word 1}" echo "${samplevar2:-word 2}" echo "${samplevar3:-word 3}" echo "${samplevar2-word 4}" echo "${samplevar3-word 5}" echo echo "例 : \${parameter:=word}" echo "${samplevar1:=word 1}" echo "${samplevar2:=word 2}" echo "${samplevar3:=word 3}" echo "samplevar2 = $samplevar2" echo "samplevar3 = $samplevar3" samplevar2="" unset samplevar3 echo "${samplevar2=word 4}" echo "${samplevar3=word 5}" echo "samplevar2 = $samplevar2" echo "samplevar3 = $samplevar3" samplevar2="" unset samplevar3 echo echo "例 : \${parameter:+word}" echo "${samplevar1:+word 1}" echo "${samplevar2:+word 2}" echo "${samplevar3:+word 3}" echo "${samplevar2+word 4}" echo "${samplevar3+word 5}" echo echo "例 : \${parameter:?word}" echo "${samplevar1:?word 1}" echo "${samplevar2:?word 2}" echo

実行結果(2)
$ ./sample.sh 例 : ${parameter:-word} abc <--- 変数が空文字列でも未設定でもない場合、そのまま変数の値を展開 word 2 <--- samplevar2が空文字列のためword 2で置換 word 3 <--- samplevar3が未設定のためword 3で置換 <--- 「:」無しの場合、空文字列では置換されない word 5 <--- 「:」無しの場合、変数未設定の際は置換 例 : ${parameter:=word} abc word 2 word 3 samplevar2 = word 2 <--- 置換が発生した場合は、変数の値自体が置換される samplevar3 = word 3 <--- 「:」無しの場合、空文字列では置換されない word 5 <--- 「:」無しの場合、変数未設定の際は置換 samplevar2 = samplevar3 = word 5 <--- 置換が発生した場合は、変数の値自体が置換される 例 : ${parameter:+word} word 1 <--- 変数が空文字列でも未設定でもない場合、word 1で置換 <--- samplevar2が空文字列の場合は、何も置換されない <--- samplevar3が未設定の場合は、何も置換されない word 4 <--- 「:」無しの場合、空文字列でも置換 <--- 「:」無しの場合、変数未設定の際は何も置換されない 例 : ${parameter:?word} abc <--- 変数が空文字列でも未設定でもない場合、そのまま変数の値を展開 ./sample.sh: line 40: samplevar2: word 2 <--- 変数が空文字列か未設定の場合、word値が標準エラーとして書き込まれ、シェルが終了

サンプルスクリプトファイル(3)
sample.sh
#!/bin/bash samplevar1="abcdefg" samplevar2=("abcde" "fghij", "12345") samplevar3=([key1]="value1" [key2]="value2" [key3]="value3") echo "例 : \${parameter:offset:length}" echo "${samplevar1:1:3}" echo "${samplevar1:2:2}" echo "${samplevar1:3:1}" echo "${samplevar1:3}" echo "${samplevar1: -2}" echo echo "${samplevar2[@]:1:2}" echo "${samplevar3[@]:1:1}" echo unset samplevar1 unset samplevar2 unset samplevar3

実行結果(3)
$ ./sample.sh 例 : ${parameter:offset:length} bcd <--- +1文字目から3文字分を展開 cd <--- +2文字目から2文字分を展開 d <--- +3文字目から1文字分を展開 defg <--- +3文字目から残りの全文字を展開 fg <--- 文字列最後尾から2文字を展開 fghij, 12345 <--- 配列samplevar2[1]、[2]を展開 <--- 連想配列の場合は結果未定義

サンプルスクリプトファイル(4)
sample.sh
#!/bin/bash samplevar1="abc" samplevar2="def" samplevar3="123" IFS="," echo "例 : \${!prefix@}" echo ${!sam@} n=0 for a in ${!sam@} do echo "[$n] : $a" (( n+=1 )) done echo echo "${!sam@}" n=0 for a in "${!sam@}" do echo "[$n] : $a" (( n+=1 )) done echo echo "例 : \${!prefix*}" echo ${!sam*} n=0 for a in ${!sam*} do echo "[$n] : $a" (( n+=1 )) done echo echo "${!sam*}" n=0 for a in "${!sam*}" do echo "[$n] : $a" (( n+=1 )) done echo echo "IFS = $IFS"

実行結果(4)
$ ./sample.sh 例 : ${!prefix@} samplevar1 samplevar2 samplevar3 <--- 名前が「sam」で始まる変数名に展開 [0] : samplevar1 <--- 二重引用符で囲まれない場合、別々の単語に展開 [1] : samplevar2 [2] : samplevar3 samplevar1 samplevar2 samplevar3 [0] : samplevar1 <--- 二重引用符で囲まれた場合でも、別々の単語に展開 [1] : samplevar2 [2] : samplevar3 例 : ${!prefix*} samplevar1 samplevar2 samplevar3 [0] : samplevar1 <--- 二重引用符で囲まれない場合、別々の単語に展開 [1] : samplevar2 [2] : samplevar3 samplevar1,samplevar2,samplevar3 [0] : samplevar1,samplevar2,samplevar3 <--- 二重引用符で囲まれた場合、IFSの最初の文字で区切られた文字列 IFS = ,

サンプルスクリプトファイル(5)
sample.sh
#!/bin/bash declare -a samplevar1=("ab" "cd" "ef") declare -A samplevar2=([key1]="abc" [key2]="def" [key3]="ghi") echo "例 : \${!name[@]}" echo echo "[@]を使用した配列のインデックスの取得(二重引用符無し)" echo ${!samplevar1[@]} for a in ${!samplevar1[@]} do echo "$a" done echo echo "[@]を使用した配列のインデックスの取得(二重引用符有り)" echo "${!samplevar1[@]}" for a in "${!samplevar1[@]}" do echo "$a" done echo echo "[@]を使用した配列のキーの取得(二重引用符無し)" echo ${!samplevar2[@]} for a in ${!samplevar2[@]} do echo "$a" done echo echo "[@]を使用した配列のキーの取得(二重引用符有り)" echo "${!samplevar2[@]}" for a in "${!samplevar2[@]}" do echo "$a" done echo echo "例 : \${!name[*]}" echo echo "[*]を使用した配列のインデックスの取得(二重引用符無し)" echo ${!samplevar1[*]} for a in ${!samplevar1[*]} do echo "$a" done echo echo "[*]を使用した配列のインデックスの取得(二重引用符有り)" echo "${!samplevar1[*]}" for a in "${!samplevar1[*]}" do echo "$a" done echo echo "[*]を使用した配列のキーの取得(二重引用符無し)" echo ${!samplevar2[*]} for a in ${!samplevar2[*]} do echo "$a" done echo echo "[*]を使用した配列のキーの取得(二重引用符有り)" echo "${!samplevar2[*]}" for a in "${!samplevar2[*]}" do echo "$a" done echo unset samplevar1 unset samplevar2

実行結果(5)
$ ./sample.sh 例 : ${!name[@]} [@]を使用した配列のインデックスの取得(二重引用符無し) 0 1 2 0 <--- 二重引用符で囲まれない場合、インデックスを別々の単語に展開 1 2 [@]を使用した配列のインデックスの取得(二重引用符有り) 0 1 2 0 <--- 二重引用符で囲まれた場合でも、インデックスを別々の単語に展開 1 2 [@]を使用した配列のキーの取得(二重引用符無し) key2 key3 key1 key2 <--- 二重引用符で囲まれない場合、キーを別々の単語に展開 key3 key1 [@]を使用した配列のキーの取得(二重引用符有り) key2 key3 key1 key2 <--- 二重引用符で囲まれた場合でも、キーを別々の単語に展開 key3 key1 例 : ${!name[*]} [*]を使用した配列のインデックスの取得(二重引用符無し) 0 1 2 0 <--- 二重引用符で囲まれない場合、インデックスを別々の単語に展開 1 2 [*]を使用した配列のインデックスの取得(二重引用符有り) 0 1 2 0 1 2 <--- 二重引用符で囲まれた場合、インデックスを一つの文字列に展開 [*]を使用した配列のキーの取得(二重引用符無し) key2 key3 key1 key2 <--- 二重引用符で囲まれない場合、キーを別々の単語に展開 key3 key1 [*]を使用した配列のキーの取得(二重引用符有り) key2 key3 key1 key2 key3 key1 <--- 二重引用符で囲まれない場合、キーを一つの文字列に展開

サンプルスクリプトファイル(6)
sample.sh
#!/bin/bash samplevar1="a" samplevar2="ab" samplevar3="abc" declare -a samplevar4=("ab" "cd" "ef" "gh") declare -A samplevar5=([key1]="abc" [key2]="def" [key3]="ghi" [key4]="jkl" [key5]="mno") echo "\${#samplevar1} = ${#samplevar1}" echo "\${#samplevar2} = ${#samplevar2}" echo "\${#samplevar3} = ${#samplevar3}" echo "\${#samplevar4[@]} = ${#samplevar4[@]}" echo "\${#samplevar4[*]} = ${#samplevar4[*]}" echo "\${#samplevar5[@]} = ${#samplevar5[@]}" echo "\${#samplevar5[*]} = ${#samplevar5[*]}" echo "\${#@} = ${#@}" echo "\${#*} = ${#*}"

実行結果(6)
$ ./sample.sh a b c <--- 3つの引数と共にスクリプトを実行 ${#samplevar1} = 1 <--- 変数に格納された値の文字列長 ${#samplevar2} = 2 <--- 〃 ${#samplevar3} = 3 <--- 〃 ${#samplevar4[@]} = 4 <--- 配列変数の要素数 ${#samplevar4[*]} = 4 <--- 〃 ${#samplevar5[@]} = 5 <--- 〃 ${#samplevar5[*]} = 5 <--- 〃 ${#@} = 3 <--- 位置パラメーター数 ${#*} = 3 <--- 〃

サンプルスクリプトファイル(7)
sample.sh
#!/bin/bash samplevar1="sample01" samplevar2="sample02" samplevar3="03sample" declare -a samplevar4=("sample_a" "sample_b" "sample_c") declare -A samplevar5=([key1]="sample_d" [key2]="sample_e" [key3]="sample_f") samplevar6="samplesample01" echo "\${samplevar1#sample} = ${samplevar1#sample}" echo "\${samplevar2#sample} = ${samplevar2#sample}" echo "\${samplevar3#sample} = ${samplevar3#sample}" echo "\${samplevar4[@]#sample} = ${samplevar4[@]#sample}" echo "\${samplevar4[*]#sample} = ${samplevar4[*]#sample}" echo "\${samplevar5[@]#sample} = ${samplevar5[@]#sample}" echo "\${samplevar5[*]#sample} = ${samplevar5[*]#sample}" echo "\${samplevar6#*sample} = ${samplevar6#*sample}" echo "\${samplevar6##*sample} = ${samplevar6##*sample}" echo "\${@#sample} = ${@#sample}" echo "\${*#sample} = ${*#sample}"

実行結果(7)
$ ./sample.sh sample_aa sample_bb <--- 2つの引数と共にスクリプトを実行 ${samplevar1#sample} = 01 <--- 「#」以降の「sample」に一致する接頭辞を削除 ${samplevar2#sample} = 02 <--- 〃 ${samplevar3#sample} = 03sample <--- 接頭辞でなければ一致しても削除対象にならない ${samplevar4[@]#sample} = _a _b _c <--- 配列変数の場合は各要素に適用 ${samplevar4[*]#sample} = _a _b _c <--- 〃 ${samplevar5[@]#sample} = _e _f _d <--- 〃 ${samplevar5[*]#sample} = _e _f _d <--- 〃 ${samplevar6#*sample} = sample01 <--- 「#」では最短一致部分を削除(「*」は任意文字にマッチ) ${samplevar6##*sample} = 01 <--- 「##」では最長一致部分を削除(「*」は任意文字にマッチ) ${@#sample} = _aa _bb <--- 「@」「*」指定では位置パラメーターに適用 ${*#sample} = _aa _bb <--- 〃

サンプルスクリプトファイル(8)
sample.sh
#!/bin/bash samplevar1="01sample" samplevar2="02sample" samplevar3="sample03" declare -a samplevar4=("a_sample" "b_sample" "c_sample") declare -A samplevar5=([key1]="d_sample" [key2]="e_sample" [key3]="f_sample") samplevar6="01samplesample" echo "\${samplevar1%sample} = ${samplevar1%sample}" echo "\${samplevar2%sample} = ${samplevar2%sample}" echo "\${samplevar3%sample} = ${samplevar3%sample}" echo "\${samplevar4[@]%sample} = ${samplevar4[@]%sample}" echo "\${samplevar4[*]%sample} = ${samplevar4[*]%sample}" echo "\${samplevar5[@]%sample} = ${samplevar5[@]%sample}" echo "\${samplevar5[*]%sample} = ${samplevar5[*]%sample}" echo "\${samplevar6%sample*} = ${samplevar6%sample*}" echo "\${samplevar6%%sample*} = ${samplevar6%%sample*}" echo "\${@%sample} = ${@%sample}" echo "\${*%sample} = ${*%sample}"

実行結果(8)
$ ./sample.sh aa_sample bb_sample <--- 2つの引数と共にスクリプトを実行 ${samplevar1%sample} = 01 <--- 「%」以降の「sample」に一致する接尾辞を削除 ${samplevar2%sample} = 02 <--- 〃 ${samplevar3%sample} = sample03 <--- 接尾辞でなければ一致しても削除対象にならない ${samplevar4[@]%sample} = a_ b_ c_ <--- 配列変数の場合は各要素に適用 ${samplevar4[*]%sample} = a_ b_ c_ <--- 〃 ${samplevar5[@]%sample} = e_ f_ d_ <--- 〃 ${samplevar5[*]%sample} = e_ f_ d_ <--- 〃 ${samplevar6%sample*} = 01sample <--- 「%」では最短一致部分を削除(「*」は任意文字にマッチ) ${samplevar6%%sample*} = 01 <--- 「%%」では最長一致部分を削除(「*」は任意文字にマッチ) ${@%sample} = aa_ bb_ <--- 「@」「*」指定では位置パラメーターに適用 ${*%sample} = aa_ bb_ <--- 〃

サンプルスクリプトファイル(9)
sample.sh
#!/bin/bash samplevar1="01sample" samplevar2="02sample" samplevar3="sample03" declare -a samplevar4=("a_sample" "b_sample" "c_sample") declare -A samplevar5=([key1]="d_sample" [key2]="e_sample" [key3]="f_sample") samplevar6="01samplesample" echo "\${samplevar1/sample/aaa} = ${samplevar1/sample/aaa}" echo "\${samplevar2/sample/} = ${samplevar2/sample/}" echo "\${samplevar3/sample/ccc} = ${samplevar3/sample/ccc}" echo "\${samplevar4[@]/sample/ddd} = ${samplevar4[@]/sample/ddd}" echo "\${samplevar4[*]/sample/eee} = ${samplevar4[*]/sample/eee}" echo "\${samplevar5[@]/sample/fff} = ${samplevar5[@]/sample/fff}" echo "\${samplevar5[*]/sample/ggg} = ${samplevar5[*]/sample/ggg}" echo "\${samplevar6/sample/hhh} = ${samplevar6/sample/hhh}" echo "\${samplevar6/sample*/iii} = ${samplevar6/sample*/iii}" echo "\${@/sample/jjj} = ${@/sample/jjj}" echo "\${*/sample/kkk} = ${*/sample/kkk}" echo "\${samplevar1/#sample/lll} = ${samplevar1/#sample/lll}" echo "\${samplevar3/#sample/mmm} = ${samplevar3/#sample/mmm}" echo "\${samplevar1/%sample/lll} = ${samplevar1/%sample/lll}" echo "\${samplevar3/%sample/mmm} = ${samplevar3/%sample/mmm}" echo "\${samplevar6//sample/nnn} = ${samplevar6//sample/nnn}"

実行結果(9)
$ ./sample.sh sample01 sample02 <--- 2つの引数と共にスクリプトを実行 ${samplevar1/sample/aaa} = 01aaa <--- 「sample」に一致する文字列を「aaa」に置換 ${samplevar2/sample/} = 02 <--- string部分が空文字列の場合、一致する文字列を削除 ${samplevar3/sample/ccc} = ccc03 <--- 一致する文字列の位置に関係なく置換を実行 ${samplevar4[@]/sample/ddd} = a_ddd b_ddd c_ddd <--- 配列変数の場合は各要素に適用 ${samplevar4[*]/sample/eee} = a_eee b_eee c_eee <--- 〃 ${samplevar5[@]/sample/fff} = e_fff f_fff d_fff <--- 〃 ${samplevar5[*]/sample/ggg} = e_ggg f_ggg d_ggg <--- 〃 ${samplevar6/sample/hhh} = 01hhhsample <--- 指定なしの場合、置換は最初に一致した部分のみ ${samplevar6/sample*/iii} = 01iii <--- 「*」は任意文字にマッチ ${@/sample/jjj} = jjj01 jjj02 <--- 「@」「*」指定では位置パラメーターに適用 ${*/sample/kkk} = kkk01 kkk02 <--- 〃 ${samplevar1/#sample/lll} = 01sample <--- パターン文字列が「#」で始まる場合、接頭辞にマッチ・置換 ${samplevar3/#sample/mmm} = mmm03 <--- 〃 ${samplevar1/%sample/lll} = 01lll <--- パターン文字列が「%」で始まる場合、接尾辞にマッチ・置換 ${samplevar3/%sample/mmm} = sample03 <--- 〃 ${samplevar6//sample/nnn} = 01nnnnnn <--- パターン文字列が「/」で始まる場合、一致する全てを置換

サンプルスクリプトファイル(10)
sample.sh
#!/bin/bash samplevar1="abcdefg" samplevar2="ABCDEFG" declare -a samplevar3=("abcde" "ABCDE" "ace" "ACE") declare -A samplevar4=([key1]="ABCDE" [key2]="abcde" [key3]="ACE" [key4]="ace") samplevar5="abab" samplevar6="ABAB" echo "\${samplevar1^a} = ${samplevar1^a}" echo "\${samplevar2,A} = ${samplevar2,A}" echo "\${samplevar1^b} = ${samplevar1^b}" echo "\${samplevar2,B} = ${samplevar2,B}" echo "\${samplevar1^^b} = ${samplevar1^^b}" echo "\${samplevar2,,B} = ${samplevar2,,B}" echo "\${samplevar1^^bc} = ${samplevar1^^bc}" echo "\${samplevar2,,BC} = ${samplevar2,,BC}" echo "\${samplevar3[@]^a} = ${samplevar3[@]^a}" echo "\${samplevar3[*],A} = ${samplevar3[*],A}" echo "\${samplevar4[@]^a} = ${samplevar4[@]^a}" echo "\${samplevar4[*],A} = ${samplevar4[*],A}" echo "\${@^a} = ${@^a}" echo "\${*,A} = ${*,A}" echo "\${samplevar5^^a} = ${samplevar5^^a}" echo "\${samplevar6,,B} = ${samplevar6,,B}"

実行結果(10)
$ ./sample.sh abc ABC <--- 2つの引数と共にスクリプトを実行 ${samplevar1^a} = Abcdefg <--- 「^」直後の文字と一致する先頭の文字を大文字に変換 ${samplevar2,A} = aBCDEFG <--- 「,」直後の文字と一致する先頭の文字を小文字に変換 ${samplevar1^b} = abcdefg <--- 先頭の文字以外は無効 ${samplevar2,B} = ABCDEFG <--- 〃 ${samplevar1^^b} = aBcdefg <--- 「^^」直後の文字と一致する文字を大文字に変換 ${samplevar2,,B} = AbCDEFG <--- 「,,」直後の文字と一致する文字を小文字に変換 ${samplevar1^^bc} = abcdefg <--- 複数文字の指定は無効 ${samplevar2,,BC} = ABCDEFG <--- 〃 ${samplevar3[@]^a} = Abcde ABCDE Ace ACE <--- 配列変数の場合は各要素に適用 ${samplevar3[*],A} = abcde aBCDE ace aCE <--- 〃 ${samplevar4[@]^a} = Ace Abcde ACE ABCDE <--- 〃 ${samplevar4[*],A} = ace abcde aCE aBCDE <--- 〃 ${@^a} = Abc ABC <--- 「@」「*」指定では位置パラメーターに適用 ${*,A} = abc aBC <--- 〃 ${samplevar5^^a} = AbAb <--- 「^^」は文字列ないの複数対象の変換も可能 ${samplevar6,,B} = AbAb <--- 「,,」は文字列ないの複数対象の変換も可能

サンプルスクリプトファイル(11)
sample.sh
#!/bin/bash samplevar1="abcdefg" samplevar2="ABCDEFG" samplevar3="abc def" samplevar4="\tabc\n" samplevar5="\V \t" declare -a samplevar6=("abcde" "ABCDE" "ace" "ACE") declare -A samplevar7=([key1]="ABCDE" [key2]="abcde" [key3]="ACE" [key4]="ace") echo "\${samplevar1@U} = ${samplevar1@U}" echo "\${samplevar1@u} = ${samplevar1@u}" echo "\${samplevar2@L} = ${samplevar2@L}" echo "\${samplevar3} = ${samplevar3}" echo "\${samplevar3@Q} = ${samplevar3@Q}" echo "\${samplevar4} = ${samplevar4}" echo $'\tabc\n' echo "\${samplevar4@E} = ${samplevar4@E}" echo "\${samplevar5} = ${samplevar5}" echo "\${samplevar5@P} = ${samplevar5@P}" echo "\${samplevar6[@]@K} = ${samplevar6[@]@K}" echo "\${samplevar7[@]@K} = ${samplevar7[@]@K}" echo "\${samplevar6[@]@U} = ${samplevar6[@]@U}" echo "\${samplevar6[*]@U} = ${samplevar6[*]@U}" echo "\${samplevar7[@]@U} = ${samplevar7[@]@U}" echo "\${samplevar7[*]@U} = ${samplevar7[*]@U}" echo "\${@@U} = ${@@U}" echo "\${*@U} = ${*@U}"

実行結果(11)
$ ./sample.sh aBcDe AbCdE <--- 2つの引数と共にスクリプトを実行 ${samplevar1@U} = ABCDEFG <--- 「@U」は小文字アルファベットを大文字に変換 ${samplevar1@u} = Abcdefg <--- 「@u」は最初の小文字アルファベットを大文字に変換 ${samplevar2@L} = abcdefg <--- 「@L」は大文字アルファベットを小文字に変換 ${samplevar3} = abc def <--- 空白文字を含む変数の通常のパラメータ展開 ${samplevar3@Q} = 'abc def' <--- 「@Q」は入力として再利用できる形式で展開 ${samplevar4} = \tabc\n <--- バックスラッシュによるエスケープ文字を含む変数の通常のパラメータ展開 abc <--- $'...'形式によるsamplevar4変数の値と同じ文字列の展開 ${samplevar4@E} = abc <--- 「@E」を使用した展開。$'...'と同じ結果となる ${samplevar5} = \V \t <--- 通常のパラメータ展開ではプロンプト文字列用の特殊文字は展開されない ${samplevar5@P} = 5.1.16 15:07:46 <--- 「@P」はプロンプト文字列と同様の特殊文字を展開 ${samplevar6[@]@K} = 0 "abcde" 1 "ABCDE" 2 "ace" 3 "ACE" <--- 「@K」は配列のキーと値のペアに展開 ${samplevar7[@]@K} = key4 "ace" key2 "abcde" key3 "ACE" key1 "ABCDE" <--- 〃 ${samplevar6[@]@U} = ABCDE ABCDE ACE ACE <--- 「@U」等を添え字が[@]、[*]の配列に使用した場合、各要素に適用され結果のリストを展開 ${samplevar6[*]@U} = ABCDE ABCDE ACE ACE <--- 〃 ${samplevar7[@]@U} = ACE ABCDE ACE ABCDE <--- 〃 ${samplevar7[*]@U} = ACE ABCDE ACE ABCDE <--- 〃 ${@@U} = ABCDE ABCDE <--- 「@U」等を@、*に使用した場合、位置パラメータに適用され結果のリストを展開 ${*@U} = ABCDE ABCDE <--- 〃

(04) コマンド置換


サンプルスクリプトファイル
sample.sh
#!/bin/bash n=1 for a in $( ls $1 ) <--- 着色部がlsコマンドの実行結果に置換される do echo "$n $a" (( n += 1 )) done

実行結果
$ ./sample.sh /usr <--- ディレクトリパスを引数にしてスクリプトを実行 1 bin 2 include 3 lib 4 libexec 5 local 6 sbin 7 share 8 src

(05) 算術展開


サンプルスクリプトファイル
sample.sh
#!/bin/bash declare -a ary=(1 2 3) n=0 for a in ${ary[@]} do n=$(( n + a )) <--- 算術式の評価結果を展開 echo "$n $a" done

実行結果
$ ./sample.sh 1 1 3 2 6 3

(06) 単語分割


サンプルスクリプトファイル
sample.sh
#!/bin/bash samplevar="aa bb cc" n=0 for a in $samplevar do echo "$n --- $a" (( n+= 1)) done echo n=0 for a in "$samplevar" do echo "$n --- $a" (( n+= 1)) done

実行結果
$ ./sample.sh 0 --- aa <--- 二重引用符の無いパラメータ展開の場合、単語分割を行う 1 --- bb 2 --- cc 0 --- aa bb cc <--- 二重引用符内のパラメータ展開の場合、単語分割は行わない

(07) パス名展開


サンプルスクリプトファイル(1)
sample.sh
#!/bin/bash echo "特殊パターン文字 : 「*」 --- /usr/*" echo /usr/* echo echo "特殊パターン文字 : 「?」 --- /usr/???" echo /usr/??? echo echo "特殊パターン文字 : 「[」 --- /usr/[bl]*" echo /usr/[bl]* echo

実行結果(1)
特殊パターン文字 : 「*」 --- /usr/* /usr/bin /usr/include /usr/lib /usr/libexec /usr/local /usr/sbin /usr/share /usr/src <--- 「*」は任意の文字列にマッチ。/usr/内の全ファイル名を展開 特殊パターン文字 : 「?」 --- /usr/??? /usr/bin /usr/lib /usr/src <--- 「*」は任意の一文字にマッチ。3文字のファイル名を展開 特殊パターン文字 : 「[」 --- /usr/[bl]* /usr/bin /usr/lib /usr/libexec /usr/local <--- 「[]」は囲まれた文字にマッチ。「bl」から始まるファイル名を展開

サンプルスクリプトファイル(2)
パターンマッチング
sample.sh
#!/bin/bash echo "\$( ls sampledir )" echo $( ls sampledir ) echo cd sampledir echo "「*」" echo * echo echo "「a*」" echo a* echo echo "「???.txt」" echo ???.txt echo echo "「a*.t??」" echo a*.t?? echo echo "「[a-zA-Z]*.txt」" echo [a-zA-Z]*.txt echo echo "「[[:alnum:]]*.txt」" echo [[:alnum:]]*.txt echo echo "「[[:ascii:]]*.jpg」" echo [[:ascii:]]*.jpg echo echo "「*[[:blank:]]*.txt」" echo *[[:blank:]]*.txt echo echo "「*[[:digit:]]*.txt」" echo *[[:digit:]]*.txt echo echo "「*[[:graph:]]??.txt」" echo *[[:graph:]]??.txt echo echo "「[[:lower:]]*.txt」" echo [[:lower:]]*.txt echo echo "「*[[:print:]]??.txt」" echo *[[:print:]]??.txt echo echo "「*[[:punct:]]??」" echo *[[:punct:]]?? echo echo "「[[:upper:]]*」" echo [[:upper:]]* echo echo "「[[:word:]]*」" echo [[:word:]]* echo echo "「[[:xdigit:]]*.txt」" echo [[:xdigit:]]*.txt echo

実行結果(2)
パターンマッチング
$ ./sample.sh $( ls sampledir ) 123.txt aaa.sh _aaa.txt aaa.txt Abc123.gif Abc123.jpg Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt サンプル.jpg 「*」 123.txt aaa.sh _aaa.txt aaa.txt Abc123.gif Abc123.jpg Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt サンプル.jpg 任意の文字列にマッチ。全ファイルが該当 「a*」 aaa.sh aaa.txt abcde.txt <--- 「a」で始まるファイル名にマッチ 「???.txt」 123.txt aaa.txt bbb.txt <--- 拡張子以外が3文字で、拡張子が「.txt」であるファイル名にマッチ 「a*.t??」 aaa.txt abcde.txt <--- 「a」で始まり、最初が「t」で3文字の拡張子であるファイル名にマッチ 「[a-zA-Z]*.txt」 aaa.txt Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt <--- アルファベットで始まり、拡張子が「.txt」であるファイル名にマッチ 「[[:alnum:]]*.txt」 123.txt aaa.txt Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt <--- 英数字で始まり、拡張子が「.txt」であるファイル名にマッチ 「[[:ascii:]]*.jpg」 Abc123.jpg <--- アスキー文字で始まり、拡張子が「.jpg」であるファイル名にマッチ 「*[[:blank:]]*.txt」 bla nk.txt <--- 空白を含み、拡張子が「.txt」であるファイル名にマッチ 「*[[:digit:]]*.txt」 123.txt Abc123.txt <--- 数字を含み、拡張子が「.txt」であるファイル名にマッチ 「*[[:graph:]]??.txt」 123.txt _aaa.txt aaa.txt Abc123.txt abcde.txt bbb.txt bcdef.txt <--- 拡張子以外の後ろから3文字目が空白を除く印字可能な文字で、拡張子が「.txt」であるファイル名にマッチ 「[[:lower:]]*.txt」 aaa.txt abcde.txt bbb.txt bcdef.txt bla nk.txt <--- 英小文字で始まり、拡張子が「.txt」であるファイル名にマッチ 「*[[:print:]]??.txt」 123.txt _aaa.txt aaa.txt Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt <--- 拡張子以外の後ろから3文字目が空白を含む印字可能な文字で、拡張子が「.txt」であるファイル名にマッチ 「*[[:punct:]]??」 aaa.sh <--- ファイル名全体の後ろから3文字目が句読点であるファイル名にマッチ 「[[:upper:]]*」 Abc123.gif Abc123.jpg Abc123.txt <--- 英大文字で始まるファイル名にマッチ 「[[:word:]]*」 123.txt aaa.sh _aaa.txt aaa.txt Abc123.gif Abc123.jpg Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt サンプル.jpg 文字、数字、「_」で始まるファイル名にマッチ 「[[:xdigit:]]*.txt」 123.txt aaa.txt Abc123.txt abcde.txt bbb.txt bcdef.txt bla nk.txt <--- 16進数で始まるファイル名にマッチ

実行環境

GNU bash, version 5.1.16
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。