Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2914

bashの位置パラメータの動作確認

$
0
0

きっかけ

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の効果が出ないようです。

最後に

知っている人は知っている知識なのでしょう。
自分で試して、知っている側になれて良かったです。
クラウドが全盛になってくると、このような知識はますます表に出てこなくなるのでしょうね。


Viewing all articles
Browse latest Browse all 2914

Trending Articles