Linux/UnixのBourne Againシェル (bash
) における「変数」とは、プログラムで扱われる数値や文字列などの値を一時的に記憶しておく領域のことです。変数を識別するために、ひとつひとつの変数に固有の名前を付けておきます。これを「変数名」といいます。
$#
$-
$?
$$
$!
$*
$@
BASH
BASH_ENV
BASH_VERSION
EUID
FCEDIT
FIGNORE
GLOBIGNORE
GROUPS
HISTCMD
HISTFILE
HISTFILESIZE
HISTIGNORE
HISTSIZE
HOSTNAME
HOSTTYPE
IGNOREEOF
MACHTYPE
OLDPWD
OPTARG
OPTERR
OPTIND
OSTYPE
PIPESTATUS
PPID
PROMPT_COMMAND
PS1
PS2
PWD
RANDOM
SHELLOPTS
SHLVL
TMOUT
UID
すべて変数の値を表示するには set
コマンドを使用する。
$ set | more
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="10")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSION='5.0.17(1)-release'
COLUMNS=120
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/tsuka/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/tsuka
HOSTNAME=E595
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=30
LOGNAME=tsuka
--More--
Bourne シェルで変数に値を代入する書式を次に示します。
name=value ...
変数名と値のペアを空白で区切って、一度に複数のシェル変数を設定することもできる。
$ userid=tsuka homedir=/home/marina maxno=256
空白を含む文字列を変数に代入する場合、文字列を2重引用符で括ります。
$ var="spring summer fall winter"
コマンドの実行結果を変数に代入するには、コマンドをバッククォーテーション「`」で囲みます。シングルクォーテーション「'」と間違えないようにしてください。
$ today=`date`
$ echo "現在の時刻は $today です。"
bash では配列変数を利用できる。配列を設定する構文を次に示す。
var=(value ...)
個別の要素に値を設定することもできる。
var[n]=value
bashではローカル変数を使用できる。ローカル変数とは、変数を設定した関数内でのみ参照できる変数である。
local name=value
変数名の前にドル記号を付けると、変数に代入された値を表すことになります。この $ 変数名 という表現をコマンドの引数などに使うことで、変数の値を参照することができます。
たとえば、 echo は引数に指定された文字列を標準出力に出力するコマンドですが、文字列の代わりに変数の値を表す $ 変数名 を引数に指定すると、変数の値が標準出力に出力されます。
$ var=/tmp
$ echo var
var
$ echo $var
/tmp
変数名の後に文字列が続く場合、後続の文字列が変数名の一部と解釈されないよう、中括弧で変数名を括ります。
${name}
$ var=/tmp
$ echo ${var}directory
/tmpdirectory
シェル変数を削除するには、unsetコマンドを使用する。
unset var
シェル変数を削除する例を示す。
$ unset TMOUT
定義済み変数とは、シェルによってあらかじめ定義されている変数のことである。Boune Againシェルにおける定義済み変数を次に示す。
Bourneシェルには、計算した結果を変数に代入する機能は無い。そのため、計算結果を変数に代入するには、引数を式として評価する外部コマンド expr を利用する。
num=1
num=`expr $num + 1`
定位置パラメタ数。定位置パラメタとはスクリプトや関数の引数のことです。
$ cat example.sh
echo $#
$ bash example.sh foo bar baz
3
呼び出し時にまたは set コマンドによってシェルに与えられたフラグ
最後に同期実行されたコマンドが返した 10 進数
Javaのソースファイルをコンパイルして、エラーが発生したらシェル・スクリプトを終了する例を次に示します。
javac Example.java
if [ ! $? = 0 ] ; then exit ; fi
java Example
このシェルのプロセス番号
$ cat example.sh
echo $$
$ echo $$
7
$ bash example.sh
84
最後に呼び出されたバックグラウンドコマンドのプロセス番号
シェルスクリプトのすべての引数。"$*"のようにダブルクォートで囲んだ場合、 "$1 $2 ... $ n" のように、全引数をひとつに繋げた形で展開される。
function example() {
echo "$#"
}
echo "$*"
example "$*"
上記シェルスクリプトの実行結果を以下に示す。
$ bash example.sh foo bar baz
foo bar baz
1
シェルスクリプトのすべての引数。"$@"のようにダブルクォートで囲んだ場合、 "$1" "$2" ... "$ n" のように、それぞれの引数を個別にダブルクォートで囲んで展開される。
function example() {
echo "$#"
}
echo "$@"
example "$@"
上記シェルスクリプトの実行結果を以下に示す。
$ bash example.sh foo bar baz
foo bar baz
3
bash のフルパス名
$ echo $BASH
/bin/bash
bash がシェルスクリプトとして実行された時にこのパラメーターがセットされていれば、シェルの初期化コマンドを含むファイル名として解釈されます(~/.bashrc のように)。
bash のバージョン番号
$ echo $BASH_VERSION
5.0.17(1)-release
シェル起動時に初期化される現在のユーザの実行ユーザID。この変数は読み取り専用です。
fc 組み込みコマンドのデフォルトのエディタ。
コロンで区切られたサフィックス(接尾子)のリスト。ファイル名補完の対象外とされます。
コロンで区切られたファイル名のセットを定義したパターンのリスト。パス名拡張時に無視されます。
現在のユーザがメンバーであるグループのリストを含む変数配列。この変数は読み取り専用です。
現在のコマンドの履歴リストの番号です。
履歴置換で履歴を保存するファイルの名前。デフォルト値は ~/.bash_history。この変数が定義されていない場合、シェル終了時に履歴は保存されない。
$ echo $HISTFILE
/home/tsuka/.bash_history
履歴を保存するファイルに保存するコマンド数の最大値。
$ echo $HISTFILESIZE
2000
コロンで区切られた履歴リストに保存すべきコマンドラインとして使用されるパターンのリスト。
履歴置換で記憶するコマンドの数
ホストの名前。
ホスト・タイプ
EOF 文字を受け取ったときの対話シェルの動作を制御します。
cpu-company-system のフォーマットで記述されたシステム・タイプ
cd コマンドによりセットされる以前の作業ディレクトリ
getopts ビルトイン・コマンドで処理された最後のオプション引数の値。
もし 1 をセットされた場合、getopts ビルトイン・コマンドによって生成されたエラー・メッセージを表示します。シェルが生成されるか、シェル・スクリプトが実行されるたびに OPTERR は 1 に初期化されます。
getopts ビルトイン・コマンドで処理されるべき次の引数のインデックス。
オペレーティング・システムの名前。
$ echo $OSTYPE
linux-gnu
フォアグラウンドのパイプラインで最後に実行されたプロセスの終了ステータスのリストを含む配列変数。コマンドの終了ステータスはシェル変数$?で参照できるが、最後に実行したコマンドの終了ステータスしか参照できない。パイプラインを使用したコマンドの場合、シェル変数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
PPID はシェルの親プロセスのプロセスIDを示すシェル変数である。この変数は読み取り専用であり、ユーザが値を設定することはできない。
$ echo $PPID
6
もしセットされた場合、プロンプトが表示されるたびに、その値がコマンドとして実行されてからプロンプトが表示されます。
PS1はプロンプトとして表示する文字列を設定する変数である。プロンプトの文字列には次の表に示す特殊文字を使うことができる。
特殊文字 | 説明 |
---|---|
\h | ホスト名 |
\u | 現在のユーザ名 |
tsuka@examplehost$ PS1="$ "
$ PS1="\h$ "
examplehost$ PS1="\u@\h$ "
tsuka@examplehost$
この値は展開されて(プロンプト参照)、2次プロンプト文字列として使われる。
cd コマンドによりセットされる現在の作業ディレクトリ
$ echo $PWD
/home/tsuka
この変数が参照されるたびにランダムな整数(0 から 32767の間)が生成されます。この変数に値をセットすることによって、乱数を初期化することができます。
$ echo $RANDOM
26561
$ echo $RANDOM
4024
コロンで区切られた有効なシェル・オプションのリスト
$ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
Bourne Again シェルのインスタンスが開始されるたびにひとつづつ増える値。
$ echo $SHLVL
1
bashシェルには自動ログアウト機能がある。シェル変数 TMOUT にログアウトするまでの時間を秒単位で設定することにより、指定した時間の間にユーザからの入力が無かったら、自動的にログアウトされる。
$ TMOUT=120
自動ログアウト機能を無効にするには、シェル変数 TMOUT を削除する。
$ unset TMOUT
シェル起動時に初期化される現在のユーザのユーザID。この変数は読み取り専用です。
$ echo $UID
1000