きっかけ
bashで位置パラメータを10個以上使うときの注意を読んで、気になったので自分でもテストした結果です。
位置パラメータとは
そもそも位置パラメータとは聞き慣れないので調べました。
bashのmanによると、
\$1、\$2 ・・・は位置パラメータと呼ばれるものです。
\$*、\$@ は特殊パラメータと呼ばれます。
パラメータ (parameter) は値を保持するためのものです。
パラメータは 名前、 数字、後述の 特殊なパラメータ で挙げる特殊文字のいずれかで表現されます。
シェルでの用法においては、 変数(variable) とは 名前 で表現されたパラメータです。位置パラメータ(Positional Parameters)
位置パラメータ (positional parameter) は、1 桁以上の数値で表されるパラメータです。
ただし 0 は含みません。
0 はコマンド名だからでしょうか。
特殊パラメータ
シェルはいくつかのパラメータを特別扱いします。
このようなパラメータは参照されるだけであり、 値を代入することは許されません。
位置パラメータのテスト
まずは、下記のコマンドをテストします。
test.sh
#!/bin/bashecho"\$1 = [$1]"echo"\$2 = [$2]"echo"\$3 = [$3]"echo"\$4 = [$4]"echo"\$5 = [$5]"echo"\$6 = [$6]"echo"\$7 = [$7]"echo"\$8 = [$8]"echo"\$9 = [$9]"echo"\$10 = [$10]"echo"\$11 = [$11]"echo"\$12 = [$12]"echo"\${10} = [${10}]"echo"\${11} = [${11}]"echo"\${12} = [${12}]"実行した結果が下記です。
$ chmod 744 test.sh
$ ./test.sh a b c d e f g h i j k l
$1 = [a]
$2 = [b]
$3 = [c]
$4 = [d]
$5 = [e]
$6 = [f]
$7 = [g]
$8 = [h]
$9 = [i]
$10 = [a0] ※[j] と表示されてほしい
$11 = [a1] ※[k] と表示されてほしい
$12 = [a2] ※[l] と表示されてほしい
${10} = [j]
${11} = [k]
${12} = [l]
上記のコマンドでテストした \$10は、位置パラメータ $1(中身はa) と 文字「0」と解釈され、「a0」が表示されました。
特殊パラメータ
ついでに下記の特殊パラメータも試しました。
- \$* : 全ての位置パラメータ。"\$1 \$2 \$3 ・・・"。パラメータの間は、変数IFSの値。
- \$@ : 全ての位置パラメータ。"\$1" "\$2" "\$3" ・・・
test2.sh
#!/bin/shIFS=_
echo$*echo"\$* = $*"echo"\${*} = ${*}"echo""echo$@echo"\$@ = $@"echo"\${@} = ${@}"実行します。
$ chmod 744 test2.sh
$ ./test2.sh a b c d e f g h i j k l
a b c d e f g h i j k l
$* = a_b_c_d_e_f_g_h_i_j_k_l
${*} = a_b_c_d_e_f_g_h_i_j_k_l
a b c d e f g h i j k l
$@ = a b c d e f g h i j k l
${@} = a b c d e f g h i j k l
echo $*だと、変数IFSの効果が出ないようです。
最後に
知っている人は知っている知識なのでしょう。
自分で試して、知っている側になれて良かったです。
クラウドが全盛になってくると、このような知識はますます表に出てこなくなるのでしょうね。