24時間365日フルマネージドホスティングサービスのデイーネット

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は「{}」無しでも取得することが出来ました。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar