変数

シェルは変数の機能を提供している。シェルスクリプトを組むようになると、変数はかなり必須に近い機能になってくる。シェルの提供する変数はアルファベット、数字、アンダースコアで構成される。ただし、変数の最初の1文字はアルファベットまたはアンダースコアである必要があり、変数名の最初の文字として数字を使うことはできない。

新しい変数を定義するには、次のように「=」で値を代入することで行う。

変数名=値

定義した変数には変数名の前に「$」を指定することでアクセスすることができる。

チルダ展開

=で代入するとき、=の右側では「展開」と呼ばれる処理が行われる。展開については次回以降でも説明するが、今回はその一例として「チルダ展開」を紹介しておこう。「~」はホームディレクトリに展開される。次の例のように=でチルダを代入しようとすると、~はホームディレクトリに展開され、ホームディレクトリが変数に代入される。

# homedir=~
# echo $homedir
/Users/daichi
# homedir="~"
# echo $homedir
~
#

また、シェルの展開ではダブルクォーテーションが大きな意味を持っている。~の場合、~をダブルクォーテーションで括ってから代入するとただの文字列として~が代入される。~もよく使われる入力方法なので覚えておこう。

特別な変数やパラメータ

シェルにはあらかじめシェルによって用意される変数がある。これはパラメータと呼ばれ、位置パラメータや特殊パラメータといったものが用意されている。次の表に、位置パラメータと特殊パラメータをまとめた。

位置パラメータ 内容
$1 コマンドライン引数1つ目
$2 コマンドライン引数2つ目
$3 コマンドライン引数3つ目
$4 コマンドライン引数4つ目
$5 コマンドライン引数5つ目
$6 コマンドライン引数6つ目
$7 コマンドライン引数7つ目
$8 コマンドライン引数8つ目
$9 コマンドライン引数9つ目
特殊パラメータ 内容
$* すべての位置パラメータに展開
”$*” すべての位置パラメータに展開。位置パラメータの間はIFS変数の最初の1文字で結合される。IFSが定義されていない場合には単一のスペースで結合される
$@ すべての位置パラメータに展開
”$@” すべての位置パラメータに展開。位置パラメータごとに”$1”や”$2”といった扱いになる
$# 位置パラメータの数
$? 最も最後に実行されたコマンドの終了スステータス
$- 現在設定されているオプションフラグ
$$ シェルのプロセスID
$! 最も最後にそのシェルから実行されたバックグラウンドプロセスのプロセスID
$0 シェルスクリプト名

位置パラメータと特殊パラメータはシェルでもシェルスクリプトでもよく利用するので、その意味は把握しておきたい。

特殊パラメータでは「$*」と「$@」が位置パラメータに展開される。ただし、ダブルクォーテーションで囲まれた場合に$*と$@では挙動が異なることに注意が必要だ。例えば、引数が5つあって$1、$2、$3、$4、$5が使われているとすれば、$*と$@には次のような等価関係がある。

特殊パラメータ 等価な位置パラメータ
$* $1 $2 $3 $4 $5
$@ $1 $2 $3 $4 $5
”$*” “$1 $2 $3 $4 $5”
”$@” “$1” “$2” “$3” “$4” “$5”

$*と$@は引数が空白を含んでいる場合に特に注意する必要がある。最初はわからないかもしれないが、例えばファイル名やパスに空白が含まれている場合など、この辺りの挙動の違いが問題になってくるので、そういったことが起こり得るということは覚えておいてもらえればと思う。

シェルはいくつかの変数でシェルの挙動を変える。こうした変数は特殊変数と呼ばれ、次のようなものがある。

特殊変数 内容
CDPATH cdで使われる検索パス
EDITOR fcで使われる代替エディタ。何も指定がない場合はed
FCEDIT fcで使われるエディタ
HISTSIZE コマンド履歴数
HOME ホームディレクトリ。~から展開される値
IFS 入力フィールド区切り文字。デフォルトは空白、タブ、改行
LINENO シェルスクリプトまたは関数内の現在の行数
MAIL 新着メールをチェックするメールファイル名
MAILPATH 新着メールをチェックするためのファイル名リスト
OPTIND getoptsによって処理される次の引数のインデックス。起動時に1に初期化される
PATH コマンドの検索パス
PPID シェルを起動した親プロセスのプロセスID。起動時の情報が保持され、その後で親プロセスが入れ替わったとしても、その情報は反映されない
PS1 プロンプトの文字列
PS2 第2プロンプト文字列
PS4 トレースのプレフィックス文字列

shではPS1が特殊変数となっており、この変数に設定された文字列がプロンプトとして表示される。PS1には特殊な意味を持ったフォーマットシーケンスを含めることができ、次のようなフォーマットシーケンスが用意されている。

フォーマットシーケンス 内容
\H システムの完全修飾ホスト名
\h システムのホスト名
\W カレントディレクトリのファイナルコンポーネント
\w カレントディレクトリのパス
\$ 一般ユーザーなら$、スーパーユーザーなら#
\\ バックスラッシュ

よく使うパラメータは覚えておこう

まず、位置パラメータはかなり必須の機能だ。これは覚えてしまいたい。位置パラメータは$と数字で構成されていて直感的だし、覚えることに苦労することはないだろう。特殊パラメータはすべて覚える必要はないが、少なくとも$*、$@、$#、$?は覚えておきたい。これらの特殊パラメータは特に使う機会が多い。

変数はアクセスするときに多少の加工を行うことができる。例えばパスを代入した変数からディレクトリだけ取り出すとか、ファイル名だけ取り出すとか、ったことも可能だ。本格的に文字列を加工するならawkかsed、またはPythonなどのプログラミング言語を使ったほうがよいだろう。あくまでも簡単な加工ができるということだ。この辺りについては次回、詳しく取り上げる。

参考資料