Unixシェル 変数

シェル変数

Unixシェルにおける「変数」とは、プログラムで扱われる数値や文字列などの値を一時的に記憶しておく領域のことです。変数を識別するために、ひとつひとつの変数に固有の名前を付けておきます。これを「変数名」といいます。

すべて変数の値を表示するには set コマンドを使用します。

set

sh

シェル変数の設定

Bourne シェルで変数に値を代入する書式を次に示します。

name=value
name

シェル変数の名前を指定する。

value

シェル変数に設定する値を指定する。

変数名と値のペアを空白で区切って、一度に複数のシェル変数を設定することもできる。

$ userid=tsuka homedir=/home/marina maxno=256

空白を含む文字列を変数に代入する場合、文字列を2重引用符で括ります。

$ var="spring summer fall winter"

コマンドの実行結果を変数に代入するには、コマンドをバッククォーテーション「`」で囲みます。シングルクォーテーション「'」と間違えないようにしてください。

$ today=`date`
$ echo "現在の時刻は $today です。"

シェル変数の参照

変数名の前にドル記号を付けると、変数に代入された値を表すことになります。この $ 変数名 という表現をコマンドの引数などに使うことで、変数の値を参照することができます。

たとえば、 echo は引数に指定された文字列を標準出力に出力するコマンドですが、文字列の代わりに変数の値を表す $ 変数名 を引数に指定すると、変数の値が標準出力に出力されます。

$ var=/tmp
$ echo var
var
$ echo $var
/tmp

変数名の後に文字列が続く場合、後続の文字列が変数名の一部と解釈されないよう、中括弧で変数名を括ります。

${name}
$ var=/tmp
$ echo ${var}directory
/tmpdirectory

シェル変数の削除

シェル変数を削除するには、unsetコマンドを使用する。

unset var
var

削除するシェル変数の名前を指定する。

シェル変数を削除する例を示す。

$ unset TMOUT

定義済み変数

定義済み変数とは、シェルによってあらかじめ定義されている変数のことである。Bouneシェルにおける定義済み変数を次に示す。

変数名 意味
$# 定位置パラメタ数。定位置パラメタとはスクリプトや関数の引数のことです。
$- 呼び出し時にまたは set コマンドによってシェルに与えられたフラグ
$? 最後に同期実行されたコマンドが返した 10 進数
$$ このシェルのプロセス番号
$! 最後に呼び出されたバックグラウンドコマンドのプロセス番号
$* シェルスクリプトのすべての引数。"$*"のようにダブルクォートで囲んだ場合、 "$1 $2 ... $ n " のように、全引数をひとつに繋げた形で展開される。
$@ シェルスクリプトのすべての引数。"$@"のようにダブルクォートで囲んだ場合、 "$1" "$2" ... "$ n " のように、それぞれの引数を個別にダブルクォートで囲んで展開される。

Javaのソースファイルをコンパイルして、エラーが発生したらシェル・スクリプトを終了する例を次に示します。

javac sample.java
if [ ! $? = 0 ] ; then exit ; fi
java sample

Bourneシェルには、計算した結果を変数に代入する機能は無い。そのため、計算結果を変数に代入するには、引数を式として評価する外部コマンド expr を利用する。

num=1
num=`expr $num + 1`

bash

bash (Bourne Againシェル)はshのシェル変数の機能に加え、1次元配列を使うことができる。

シェル変数の設定

bash (Bourne Againシェル)でシェル変数を設定する構文は、shと同じである。

name=value

bashでは、ローカル変数を使用できる。ローカル変数とは、変数を設定した関数内でのみ参照できる変数である。

local name=value

配列を設定する構文を次に示す。

var=(value1 value2 ...)
var[n]=value
var

配列の名前を指定する。

n

配列のインデックス(添え字)を指定する。

value

配列に設定する値を指定する。

シェル変数の参照

bashでシェル変数を参照する構文は、shと同じである。

シェル変数の削除

bashでシェル変数を削除する構文は、shと同じである。

定義済み変数

shの定義済みシェル変数に加えて、bashには次に定義済みシェル変数もある。

bashの定義済みシェル変数
変数 説明
PS1 プロンプトとして表示する文字列
TMOUT bashの自動ログアウト機能を使う場合は、ログアウトするまでの時間を秒単位で設定する。
PPID
シェルの親プロセスのプロセスID。この変数は読み取り専用です。
PWD
cd コマンドによりセットされる現在の作業ディレクトリ
OLDPWD
cd コマンドによりセットされる以前の作業ディレクトリ
UID
シェル起動時に初期化される現在のユーザのユーザID。この変数は読み取り専用です。
EUID
シェル起動時に初期化される現在のユーザの実行ユーザID。この変数は読み取り専用です。
GROUPS
現在のユーザがメンバーであるグループのリストを含む変数配列。この変数は読み取り専用です。
BASH
bash のフルパス名
BASH_VERSION
bash のバージョン番号
SHLVL
Bourne Again シェルのインスタンスが開始されるたびにひとつづつ増える値。
RANDOM
この変数が参照されるたびにランダムな整数(0 から 32767の間)が生成されます。この変数に値をセットすることによって、乱数を初期化することができます。
HISTCMD
現在のコマンドの履歴リストの番号です。
OPTARG
getopts ビルトイン・コマンドで処理された最後のオプション引数の値。
OPTIND
getopts ビルトイン・コマンドで処理されるべき次の引数のインデックス。
HOSTNAME
ホストの名前。
HOSTTYPE
ホスト・タイプ
OSTYPE
オペレーティング・システムの名前。
MACHTYPE
cpu-company-system のフォーマットで記述されたシステム・タイプ
SHELLOPTS
コロンで区切られた有効なシェル・オプションのリスト
BASH_ENV
bash がシェルスクリプトとして実行された時にこのパラメーターがセットされていれば、シェルの初期化コマンドを含むファイル名として解釈されます(~/.bashrc のように)。
PS2
この値は展開されて(プロンプト参照)、2次プロンプト文字列として使われる。
HISTSIZE
履歴置換で記憶するコマンドの数
HISTFILE
履歴置換で履歴を保存するファイルの名前。デフォルト値は ~/.bash_history。この変数が定義されていない場合、シェル終了時に履歴は保存されない。
HISTFILESIZE
履歴を保存するファイルに保存するコマンド数の最大値。
OPTERR
もし 1 をセットされた場合、getopts ビルトイン・コマンドによって生成されたエラー・メッセージを表示します。シェルが生成されるか、シェル・スクリプトが実行されるたびに OPTERR は 1 に初期化されます。
PROMPT_COMMAND
もしセットされた場合、プロンプトが表示されるたびに、その値がコマンドとして実行されてからプロンプトが表示されます。
IGNOREEOF
EOF 文字を受け取ったときの対話シェルの動作を制御します。
FCEDIT
fc 組み込みコマンドのデフォルトのエディタ。
FIGNORE
コロンで区切られたサフィックス(接尾子)のリスト。ファイル名補完の対象外とされます。
GLOBIGNORE
コロンで区切られたファイル名のセットを定義したパターンのリスト。パス名拡張時に無視されます。
HISTIGNORE
コロンで区切られた履歴リストに保存すべきコマンドラインとして使用されるパターンのリスト。
PIPESTATUS
フォアグラウンドのパイプラインで最後に実行されたプロセスの終了ステータスのリストを含む配列変数。コマンドの終了ステータスはシェル変数$?で参照できるが、最後に実行したコマンドの終了ステータスしか参照できない。パイプラインを使用したコマンドの場合、シェル変数PIPESTATUSでそれぞれの終了ステータスを参照できる。
$ cat student
horiuchi marina
kikuchi moa
taguchi hana
$ grep chi student | grep uchi | grep kiuchi
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} ${PIPESTATUS[2]}
0 0 1

PS1

PS1はプロンプトとして表示する文字列を設定する変数である。プロンプトの文字列には次の表に示す特殊文字を使うことができる。

特殊文字 説明
\h ホスト名
\u 現在のユーザ名
tsuka@examplehost$ PS1="$ "
$ PS1="\h$ "
examplehost$ PS1="\u@\h$ "
tsuka@examplehost$