シェルスクリプト 引数 使い方
バイオインフォ道場、くまぞうです。
目次
シェルスクリプト 引数
シェルスクリプト 引数の数
引数の数は、$#
で取得できます。想定している数の引数が得られない場合などは、エラーにするなどの利用方法があります。
例 arg_count.sh
#! /bin/bash # 引数の数を表示 echo "args = "$# # 引数の数をチェック(2個セットされたか?) if [ $# != 2 ]; then echo "args count error!" # エラー終了 exit 1 fi # エラーでないときだけ実行される echo "args count ok!"
実行例
# 実行権限を与える $ chmod +x ./arg_count.sh # 正常パターン(引数2個) $ ./arg_count.sh a b args = 2 args count ok! # 異常パターン(引数3個) $ ./arg_count.sh a b c args = 3 args count error!
シェルスクリプト 引数 アクセスと引数の表示
引数は、セットした順に$1
, $2
, $3
…$9
としてシェルスクリプト内でアクセスできます。セットされなかったパラメータがある場合は、${var:?}
を使ってエラーにするようにしました。
例 arg_number.sh
#! /bin/bash # シェルスクリプト実行時の引数を1から3まで順番に変数セット # 未設定の場合はエラー PARAM1=${1:?} PARAM2=${2:?} PARAM3=${3:?} # 引数として受け取った内容を1つずつ表示 echo "PARAM1="$PARAM1 echo "PARAM2="$PARAM2 echo "PARAM3="$PARAM3
実行例
# 実行権限を与える $ chmod +x ./arg_number.sh # シェルスクリプト 実行時に4つ引数を与えてみる $ ./arg_number.sh 1 p2 p3_3 4_p4 # 結果:引数として取得した3つ分を表示 PARAM1=1 PARAM2=p2 PARAM3=p3_3
# シェルスクリプト 実行時に2つ引数を与えてみる(1つ足りない) $ ./arg_number.sh 1 p2 # 結果:引数が正しくセットされていない場合はエラー ./arg_number.sh: パラメータが null または設定されていません
シェルスクリプト 引数 数が多いとどうなるか?
引数の数が9個を超えると、それ以降の引数は正しくアクセスできません。
例 arg_num9.sh
#! /bin/bash # $0(スクリプト名), $1 〜 $11 まで引数の内容を表示 for x in `seq 0 11` do eval echo '\$'$x \"\$$x\" done
実行例
# 実行権限を与える
$ chmod +x arg_num9.sh
# 11個の引数を与えて実行
$ ./arg_num9.sh a b c d e f g h i j k
# 結果:引数に正しくアクセスできるのは$9
まで。
$0 ./arg_num9.sh
$1 a
$2 b
$3 c
$4 d
$5 e
$6 f
$7 g
$8 h
$9 i
$10 a0
$11 a1
shift
を使うと、引数をずらしながらアクセスすることができます。
例 arg_num9_shift.sh
#! /bin/bash COUNT=$# for x in `seq 0 11` do if [ $x -lt $COUNT ]; then # 11個の引数を1つずつずらして$1でアクセス eval echo '\$1' \"\$1\" fi # 引数の位置を1つずらす shift done
実行例
# 実行権限を与える $ chmod +x arg_num9_shift.sh # 11個の引数を与えて実行 $ ./arg_num9_shift.sh a b c d e f g h i j k # 結果:# 11個の引数を1つずつずらして$1でアクセス $1 a $1 b $1 c $1 d $1 e $1 f $1 g $1 h $1 i $1 j $1 k
シェルスクリプト 引数 使い方
シェルスクリプトの引数の数は$#
で取得することができます。「引数が正しくセットされていない場合は、エラーにする」などの処理に活用できます。これらの引数へは、スクリプト実行時の引数としてセットした順に、$0
(スクリプト名),$1
(第1引数), $2
(第2引数), $3
…$9
としてシェルスクリプト内でアクセスできます。但し、$9
を超えると、このやり方では正しくアクセスできず、shift
を使って引数をずらしてアクセスするなどの工夫が必要になります。