Section Next | Prev


3.4.1 シェル・スクリプトでの特別な変数

引き数
シェル・スクリプトには、実行の際に空白で区切ったいくつかの引き数を渡す事ができ ます。引き数を参照するには、シェル変数 $n を使用し、 最初の引き数は $1、次は $2... となります。
引数の個数は $# で、全ての引数をまとめて参照するには $* を用います。

引数

以下の例は、第一引数、第二引数を表示、全ての引数を表示、引数の数を表示しています。

	$ cat -n testarg
	     1  #! /bin/bash
	     2  echo "1st $1, 2nd $2"
	     3  echo "all $*"
	     4  echo "number of args $#"
解説
  1. Bash の利用を宣言
  2. "1st" 第一引数, "2nd" 第二引数として表示
  3. "all" に続けて、全ての引数を表示
  4. 引数の数を表示
	$ testarg one two three four
	1st one, 2nd two
	all one two three four
	number of args 4
まとめ
引数に関する変数をまとめると、以下のようになります。

変数名 意味
$0 実行中のスクリプト・ファイル名
$* 全ての引き数。1つの文字列として扱う。
$# 引数の数。
$n 個々の引数。1番目であれば $1, 2番目は $2 の順となります。
nが二桁以上となる場合は、中括弧で結びます。例) ${100}

ファイル名置換
また引数に特殊文字(*,?などファイル名置換に用いられるもの)が含まれる場合、 シェルはファイル名置換を行ってから引数の評価を行います。
	$ ls c*
	calc  check  chfm  chkpsent  chx  clean  cntr

	$ testarg c*
	1st calc, 2nd check
	all calc check chfm chkpsent chx clean cntr
	number of args 7

シフト
引数を横に順送りし、2番目の引数を $1 へ、3番目の引数を $2 へ移動させることができます。 これをシフト(順送り)とよび shift コマンドで行うことができます。
ただし、shift コマンドを実行するたびに直前の先頭にあった $1 の値は失われます。

Shift


終了値
UNIX の殆どのコマンドやシェルスクリプトは、その実行結果が正常に終了したのか、 エラーがあったのかは実行結果の変数($?)として参照することができます。
	$ ls -ld /tmp
	drwxrwxrwt  4 root root 4096 Sep 24 10:32 /tmp
	$ echo $?
	0

	$ ls -ld /tmp/detarame
	ls: /tmp/detarame: No such file or directory
	$ echo $?
	1
この値を「戻り値」といい、UNIX では正常終了時に 0 を返すという慣習があります。
スクリプトから戻り値を指定し、終了するには exit コマンドを用います。 exit に値を指定しない場合は、その値は保障されません。かならず指定すべきです。
例えば…
	正常に終了したとき	exit 0
	エラーがあった場合	exit 2
エラー値は特に決まっていませんが、UNIX(Linux) の OS としての値は、C言語用の インクルードファイルとして /usr/include/errno.h に定義されています。
RedHat 系の Linux では /usr/include/asm/errno.h などに記述されています。
	#define EPERM            1      /* Operation not permitted */
	#define ENOENT           2      /* No such file or directory */
	#define ESRCH            3      /* No such process */
	#define EINTR            4      /* Interrupted system call */
	#define EIO              5      /* I/O error */
	#define ENXIO            6      /* No such device or address */
		: 省略


Section Next | Prev

Copyright 2007 ycosSystems Shell/Body341.html