bashで位置パラメータを10個以上使うときの注意

こんにちは。Y.Oです。本日はbashの位置パラメータについて書きます。
先日、bashを使ったシェルスクリプトを作成する際に、スクリプトに渡した引数を
いくつか上手く取得出来ない症状に遭遇しました。
何が起こってるのか調べるため、次の様なシンプルなスクリプトを作り実行してみたところ、
10個目以降の引数が想定外のものになっていました。
※ 今回使用した環境は、CentOS 7.5 のbashです。
argtest_bash.sh


#!/usr/bin/bash
echo '$0='$0
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 '$13='$13
echo '$14='$14
echo '$15='$15

実行結果


[centos@ip-10-0-0-48 ~]$ ./argtest_bash.sh a b c d e f g h i j k l n m o
$0=./argtest_bash.sh
$1=a
$2=b
$3=c
$4=d
$5=e
$6=f
$7=g
$8=h
$9=i
$10=a0
$11=a1
$12=a2
$13=a3
$14=a4
$15=a5

これ、スクリプトの書き方が悪いらしく、2 桁以上の位置パラメータは「{}」で囲む必要があるとのことでした。
以下、日本語のmanの位置パラメータの説明です。


位置パラメータ(Positional Parameters)
位置パラメータ (positional parameter)は、1桁以上の数値で表されるパラメータです。
ただし0は含みません。
位置パラメータは、シェルが起動されたときにシェルの引き数が代入されますが、組み込みコマンドの
setを使って代入し直すこともできます。
代入文を使って位置パラメータへの代入を行うことはできません。
シェル関数が実行されると、  位置パラメータは一時的に置き換えられます  (後述の 関数 を参照)。
2 桁以上の数値を含む位置パラメータを展開するときには、ブレース ({})  で囲まなければなりません (後述の 展開 を参照)。

次のように修正したスクリプトですと、問題なく取得できました。


#!/usr/bin/bash
echo '$0='$0
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 '$13='${13}
echo '$14='${14}
echo '$15='${15}

実行結果


[centos@ip-10-0-0-48 ~]$ ./argtest_bash_brace.sh a b c d e f g h i j k l m n o
$0=./argtest_bash_brace.sh
$1=a
$2=b
$3=c
$4=d
$5=e
$6=f
$7=g
$8=h
$9=i
$10=j
$11=k
$12=l
$13=m
$14=n
$15=o

因みに、他のシェルで同じ内容のスクリプトを実行したところ、kshはbashと同じく「{}」で囲う必要があり、
tcshとzshは「{}」無しでも取得することが出来ました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA