シェルスクリプト 引数の与え方とチェック方法

スポンサーリンク

シェルスクリプトに引数を与える場合、引数が少ない場合はエラーにするなどの対策が必要です。一方、引数を10個以上うけとる場合、受け取り側で引数をずらしながら1つずつ取得する必要があります。

スポンサーリンク

シェルスクリプトの引数をチェックする方法

シェルスクリプトの引数の数をチェックする

引数の数は、$#で取得できます。

想定する数が与えられたかどうかを、if文などでチェックすることができます。

例 arg_count.sh

#! /bin/bash

# 引数の数を表示
echo "args = "$#

# 引数の数をチェック(2個セットされたか?)
if [ $# != 2 ]; then
    echo "args count error!"
    # エラー終了
    exit 1
fi

# エラーでないときだけ実行される
echo "args count ok!"

実行例

# 正常パターン(引数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

実行例

# シェルスクリプト 実行時に4つ引数を与えてみる
$ ./arg_number.sh p1 p2 p3 p4

# 結果:引数として取得した3つ分を表示
PARAM1=p1
PARAM2=p2
PARAM3=p3
# シェルスクリプト 実行時に2つ引数を与えてみる(1つ足りない)
$ ./arg_number.sh p1 p2

# 結果:引数が正しくセットされていない場合はエラー
./arg_number.sh: パラメータが null または設定されていません

シェルスクリプトの引数が多い場合

引数が9個を超えると、定義済み変数($1〜$9)では足りなくなり、全部に正しくアクセスすることができません。

例 arg_num9.sh

#! /bin/bash

# $0(スクリプト名), $1 〜 $11 まで引数の内容を表示
for x in `seq 0 11`
do
    eval echo '\$'$x \"\$$x\"
done

実行例

# 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

実行例

# 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」を使って引数をずらしてアクセスするなどの工夫が必要になります。
とにかく、早く問題を解決したい人にはこちら>>直接、データ解析相談
とにかく早く問題解決したい人はこちら>>直接、論文相談

関連記事1

xargs 引数を上手に使う | find と xargs でファイルのリネームやコピーをひと工夫
bioinformaticsでは、たくさんのファイルを使うことが多いので、ファイル処理は効率的に行いたいですね。このようなときfind コマンドや xargs コマンドが役に立ちます。例えば、fastqファイルの拡張子を、fq.gz から ...
パス名からファイル名を取得する方法
パス名からファイル名を抽出する場合は、basenameコマンドを使うと簡単です。$ find . -name "test.txt" /aaa/bbb/ccc/test.txt $ find . -name "test.txt" | xarg...
不要なファイルを探す ファイル名・ファイルサイズ・ファイル更新日時
バイオインフォマティクスの解析では大きなファイルを扱うことが多いので、ストレージの管理には気を使います。ストレージの容量を確保するために、不要なファイルはこまめに削除(または他の場所へ移動・圧縮など)することが、もっとも簡単で確実な方法だと...
ファイル名を一括変更 Windowsエクスプローラーとシェルスクリプト
バイオインフォマティクスでは、データファイルが大量になることがあります。いつも頭を悩ませるのがデータの管理です。たまにファイル名を一括で変更したいときがありますが、便利な方法があるので紹介したいと思います。Windows エクスプローラーで...
シェルスクリプト | ファイル存在チェック・空ファイルチェック
bashでスクリプトを作成するときに、よく使うのがファイルの存在チェックです。if文と組合せると、ファイルの有無によって処理を分けることができます。エラー処理も記述できて使いやすいスクリプトになります。様々な処理で活用できるので、是非参考に...
シェルスクリプト 関数 スクリプトの書き方
今回は、プログラムの基本構成となる「関数」を作ってみます。シェルで関数を作成すると、普段シェルを使って行っている作業を色々と自動化できて便利なことがあります。少しずつ、使えるようになると良いですね。関数を利用したプログラムメッセージを1つず...
シェルスクリプト select メニューを作る スクリプトの書き方
select文を使うと、簡単にメニューを作成することができます。但し、Bシェルでは使えず bash を使います。リストでメニュー項目を準備します。select内の変数で、選ばれた項目や入力値を取得することができます。メニュープロンプトは、P...
シェルスクリプト Hello World スクリプトの書き方
シェルプログラミングをはじめましょう。使うシェルは「Bシェル」です。Bシェルは機能が少ないのですが、どんなUNIXシステムでも動作するという利点があります。ログインシェルはbashやzshを使っている人が多いと思いますが、これらはBシェルの...

関連記事2

bash 算術計算 書き方
シェルスクリプトを書いているとき、計算式が使えると便利なことがあります。ファイルの残りの行数を表示したいな行毎に項目を足して合計を表示したいな入力したデータを計算して処理に使いたいないろいろな状況があると思いますが、bashでも算術計算は可...
bash リダイレクションによる上書き禁止
何かコマンドからの出力を簡単にファイルに残しておけるので、リダイレクトは良く使います。しかし、たまに大事な既存ファイルに上書きしてしまって失敗することがあります。そんな「よくあるリダイレクトミス」を防ぎましょう!リダイレクトで上書き禁止する...
bash 配列の使い方|サンプルでわかる最低限の知識
bash 配列の使い方について、初期化・参照・削除のやり方〜配列を使った繰り返し処理まで、最低限の知識を短いサンプルで理解できます!bash の配列を理解すると、シェルスクリプトの応用の幅が広がります。bash 配列の使い方bash 配列の...
シェルスクリプト bash 最新版の利用
シェルスクリプト bash 最新バージョンシェルスクリプト bash バージョン確認bashのバージョン確認を行います。現在、最新版はバージョン4.4(2017年1月)です。$ bash --versionbash --versionGNU...
bash 部分文字列・置換・長さ・連結・分割の文字列処理
bashのよく使う文字列処理、部分文字列・置換・連結・長さ・分割について、サンプルを交えながらまとめます。とにかく早く問題解決したい人はこちら>>直接、データ解析相談部分文字列文字列から部分文字列を取り出すときは、位置を指定した抽出方法か、...
bash パイプ 複数コマンド 組み合わせ
複数のコマンドを連続で処理すると、解析作業が効率的に進むときがあります。コマンドの出力結果をソートしたり、さらに絞り込みを行ったりするだけで、分り易い結果になることは良くあることかもしれません。そんなちょっとしたテクニックでは、パイプ(|)...
linux コマンド プロセス置換 無駄な一時ファイルを作らない
bashでは、複数のコマンドをパイプでつなぐことができます。しかし、入力をファイルからしか受け取らない一部のコマンドでは、わざわざ一時ファイルを準備する必要があって意外と面倒です。そんなときは、プロセス置換を活用しましょう。無駄な中間ファイ...
バックグラウンド実行とフォアグラウンド実行 -プログラムの色んな実行方法-
解析プログラムは長い時間を必要とするものもあります。プログラムの実行や管理方法を理解して、作業効率を効率的に行いましょう。バックグラウンド実行とフォアグラウンド実行バックグラウンド実行をうまく活用しようプログラムの実行には、起動後その場で終...
タイトルとURLをコピーしました