Last Update 2022/08/13
展開
テスト項目
(01) ブレース展開
(02) チルダ展開
(03) パラメータ展開
(04) コマンド置換
(05) 算術展開
(06) 単語分割
(07) パス名展開
実行結果(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
「..」と整数値を追加することにより増分値を指定
実行結果(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の値に置換
#!/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を変数名として展開
#!/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値が標準エラーとして書き込まれ、シェルが終了
#!/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]を展開
<--- 連想配列の場合は結果未定義
#!/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 = ,
#!/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 <--- 二重引用符で囲まれない場合、キーを一つの文字列に展開
#!/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 <--- 〃
#!/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 <--- 〃
#!/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_ <--- 〃
#!/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 <--- パターン文字列が「/」で始まる場合、一致する全てを置換
#!/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 <--- 「,,」は文字列ないの複数対象の変換も可能
#!/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 <--- 〃
サンプルスクリプトファイル
sample.sh
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
サンプルスクリプトファイル
sample.sh
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
サンプルスクリプトファイル
sample.sh
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 <--- 二重引用符内のパラメータ展開の場合、単語分割は行わない
サンプルスクリプトファイル(1)
sample.sh
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
パターンマッチング
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
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。