変数

変数には以下の三種類が存在しています.

  • シェル変数
  • 環境変数
  • 特殊変数

シェル変数

特定のシェルでのみ有効となる変数です. シェルから起動した別のシェルやコマンドには引き継がれることがなく, そのシェル内でのみ有効な変数として定義されます.

次のように定義することで, そのシェル内に限り自由に参照できます.

bash
$ FOO="foo"

$ echo "${FOO}"
# => foo

$ bash -c 'echo "${FOO}"'
# =>
# 別シェルからは参照できない

set コマンドを実行することで, シェル変数と環境変数を同時に一覧表示できます.

環境変数

文字通り環境に跨って有効となる変数のことです. 宣言されたシェル自身とそのシェルから起動された別のシェル, コマンドなどに渡って有効となる変数として定義されます.

export コマンドを利用して定義でき, unset コマンドで破棄できます.

bash
$ export FOO="foo"

$ echo "${FOO}"
# => foo

$ bash -c 'echo "${FOO}"'
# => foo

env コマンドや printenv コマンドでその一覧を確認できます.

特殊変数

シェルにはシェル変数, 環境変数以外に特殊変数が存在しています. それぞれ次の内容が格納されています.

変数格納内容
$?直前の実行コマンドの終了コード
$!直前のバックグラウンドコマンドの PID
$nシェルスクリプトに渡された N 番目の引数
$0 はスクリプトファイル自体へのパスとなる
$#シェルスクリプトに渡された引数の数
$*シェルスクリプトに渡されたすべての引数
"$*" は結合された文字列となる
$@シェルスクリプトに渡されたすべての引数
"$@" はそれぞれの引数が文字列化された配列となる
$$現在のシェルの PID
$-現在のシェルに指定されているオプション群
$_直前のコマンドの最後の引数

主にシェルスクリプトで利用されることの多い印象があります.

bash
if [ $# -eq 0 ]
then
    echo "Argument is required"
    exit 1
fi

verbose="FALSE"
target="none"

while [ $# -gt 0 ]
do
    case $1 in
        -h | --help)
            echo "This script is a sample... Please read $0 !"
            exit 0
            ;;
        -v | --verbose)
            verbose="TRUE"
            ;;
        --target)
            target="$2"
            shift
            ;;
    esac
    shift
done

if [ "$verbose" = "TRUE" ]
then
    echo "parsed options: verbose=${verbose}, target=${target}"
fi

if [ "$target" = "none" ]
then
    echo "Nothing to do!"
else
    echo "Hello ${target}!"
fi