きっかけ
bashで位置パラメータを10個以上使うときの注意を読んで、気になったので自分でもテストした結果です。
位置パラメータとは
そもそも位置パラメータとは聞き慣れないので調べました。
bashのmanによると、
$1、$2 ・・・は位置パラメータと呼ばれるものです。
$*、$@ は特殊パラメータと呼ばれます。
パラメータ (parameter) は値を保持するためのものです。
パラメータは 名前、 数字、後述の 特殊なパラメータ で挙げる特殊文字のいずれかで表現されます。
シェルでの用法においては、 変数(variable) とは 名前 で表現されたパラメータです。
位置パラメータ(Positional Parameters)
位置パラメータ (positional parameter) は、1 桁以上の数値で表されるパラメータです。
ただし 0 は含みません。
0 はコマンド名だからでしょうか。
特殊パラメータ
シェルはいくつかのパラメータを特別扱いします。
このようなパラメータは参照されるだけであり、 値を代入することは許されません。
位置パラメータのテスト
まずは、下記のコマンドをテストします。
# !/bin/bash
echo "\$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" ・・・
# !/bin/sh
IFS=_
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の効果が出ないようです。
最後に
知っている人は知っている知識なのでしょう。
自分で試して、知っている側になれて良かったです。
クラウドが全盛になってくると、このような知識はますます表に出てこなくなるのでしょうね。