bashのシェル変数

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

目次

  1. 1 変数の確認
  2. 2 変数の設定
    1. 2.1 配列変数の設定
    2. 2.2 ローカル変数の設定
  3. 3 変数の参照
  4. 4 シェル変数の削除
  5. 5 定義済み変数
    1. $#
    2. $-
    3. $?
    4. $$
    5. $!
    6. $*
    7. $@
    8. BASH
    9. BASH_ENV
    10. BASH_VERSION
    11. EUID
    12. FCEDIT
    13. FIGNORE
    14. GLOBIGNORE
    15. GROUPS
    16. HISTCMD
    17. HISTFILE
    18. HISTFILESIZE
    19. HISTIGNORE
    20. HISTSIZE
    21. HOSTNAME
    22. HOSTTYPE
    23. IGNOREEOF
    24. MACHTYPE
    25. OLDPWD
    26. OPTARG
    27. OPTERR
    28. OPTIND
    29. OSTYPE
    30. PIPESTATUS
    31. PPID
    32. PROMPT_COMMAND
    33. PS1
    34. PS2
    35. PWD
    36. RANDOM
    37. SHELLOPTS
    38. SHLVL
    39. TMOUT
    40. UID

1 変数の確認

すべて変数の値を表示するには 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--

2 変数の設定

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

name=value ...
name
シェル変数の名前を指定する。
value
シェル変数に設定する値を指定する。

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

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

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

$ var="spring summer fall winter"

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

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

2.1 配列変数の設定

bash では配列変数を利用できる。配列を設定する構文を次に示す。

var=(value ...)

個別の要素に値を設定することもできる。

var[n]=value
var
配列の名前を指定する。
n
配列のインデックス(添え字)を指定する。
value
配列に設定する値を指定する。

2.2 ローカル変数の設定

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

local name=value

3 シェル変数の参照

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

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

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

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

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

4 シェル変数の削除

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

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

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

$ unset TMOUT

5 定義済み変数

定義済み変数とは、シェルによってあらかじめ定義されている変数のことである。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

bash のフルパス名

$ echo $BASH
/bin/bash

BASH_ENV

bash がシェルスクリプトとして実行された時にこのパラメーターがセットされていれば、シェルの初期化コマンドを含むファイル名として解釈されます(~/.bashrc のように)。

BASH_VERSION

bash のバージョン番号

$ echo $BASH_VERSION
5.0.17(1)-release

EUID

シェル起動時に初期化される現在のユーザの実行ユーザID。この変数は読み取り専用です。

FCEDIT

fc 組み込みコマンドのデフォルトのエディタ。

FIGNORE

コロンで区切られたサフィックス(接尾子)のリスト。ファイル名補完の対象外とされます。

GLOBIGNORE

コロンで区切られたファイル名のセットを定義したパターンのリスト。パス名拡張時に無視されます。

GROUPS

現在のユーザがメンバーであるグループのリストを含む変数配列。この変数は読み取り専用です。

HISTCMD

現在のコマンドの履歴リストの番号です。

HISTFILE

履歴置換で履歴を保存するファイルの名前。デフォルト値は ~/.bash_history。この変数が定義されていない場合、シェル終了時に履歴は保存されない。

$ echo $HISTFILE
/home/tsuka/.bash_history

HISTFILESIZE

履歴を保存するファイルに保存するコマンド数の最大値。

$ echo $HISTFILESIZE
2000

HISTIGNORE

コロンで区切られた履歴リストに保存すべきコマンドラインとして使用されるパターンのリスト。

HISTSIZE

履歴置換で記憶するコマンドの数

HOSTNAME

ホストの名前。

HOSTTYPE

ホスト・タイプ

IGNOREEOF

EOF 文字を受け取ったときの対話シェルの動作を制御します。

MACHTYPE

cpu-company-system のフォーマットで記述されたシステム・タイプ

OLDPWD

cd コマンドによりセットされる以前の作業ディレクトリ

OPTARG

getopts ビルトイン・コマンドで処理された最後のオプション引数の値。

OPTERR

もし 1 をセットされた場合、getopts ビルトイン・コマンドによって生成されたエラー・メッセージを表示します。シェルが生成されるか、シェル・スクリプトが実行されるたびに OPTERR は 1 に初期化されます。

OPTIND

getopts ビルトイン・コマンドで処理されるべき次の引数のインデックス。

OSTYPE

オペレーティング・システムの名前。

$ echo $OSTYPE
linux-gnu

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

PPID

PPID はシェルの親プロセスのプロセスIDを示すシェル変数である。この変数は読み取り専用であり、ユーザが値を設定することはできない。

$ echo $PPID
6

PROMPT_COMMAND

もしセットされた場合、プロンプトが表示されるたびに、その値がコマンドとして実行されてからプロンプトが表示されます。

PS1

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

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

PS2

この値は展開されて(プロンプト参照)、2次プロンプト文字列として使われる。

PWD

cd コマンドによりセットされる現在の作業ディレクトリ

$ echo $PWD
/home/tsuka

RANDOM

この変数が参照されるたびにランダムな整数(0 から 32767の間)が生成されます。この変数に値をセットすることによって、乱数を初期化することができます。

$ echo $RANDOM
26561
$ echo $RANDOM
4024

SHELLOPTS

コロンで区切られた有効なシェル・オプションのリスト

$ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

SHLVL

Bourne Again シェルのインスタンスが開始されるたびにひとつづつ増える値。

$ echo $SHLVL
1

TMOUT

bashシェルには自動ログアウト機能がある。シェル変数 TMOUT にログアウトするまでの時間を秒単位で設定することにより、指定した時間の間にユーザからの入力が無かったら、自動的にログアウトされる。

$ TMOUT=120

自動ログアウト機能を無効にするには、シェル変数 TMOUT を削除する。

$ unset TMOUT

UID

シェル起動時に初期化される現在のユーザのユーザID。この変数は読み取り専用です。

$ echo $UID
1000

関連記事