Shellスクリプト

【Shellスクリプト】変数と特殊変数について!

2020年4月2日

シェル上ではシェル変数によって変数を扱うことが可能です。また、シェル変数以外に、特殊変数と呼ばれる一種の変数が存在します。

この記事でわかること

  • シェル変数とは?
  • 特殊変数とは?

極稀に変数の中にコマンドを代入して実行させたい、つまり「2重展開」を行いたいと検索してこのページへたどり着く方がいるようです。2重展開については「eval」コマンドを参照してください。

変数とは?

シェルには「シェル変数」と「特殊変数」が機能として予め用意されています。シェル変数は環境変数としてエクスポートすることが可能です。

シェル変数とは?

変数とは、値(文字や数値)を入れて置くための箱です。

シェルでは、シュル変数によって値を一時的に保管しておくことが可能です。後で必要な時にシェル変数から値を取り出します。簡単に言うと、パソコンで処理をするときに、データを代入して効率的に処理をする箱といった認識で良いでしょう。

例えば、ユーザがOSにログインした時、起点となるディレクトリをホームディレクトリといいますが、これは$HOMEというシェル変数の値としてセットされています。いま無理におぼなくても、シェルを扱っているうちに、自然に覚えていくことになりますので、ご安心ください。

変数名についてのルール

シェル変数の名前には、アルファベット、数字、アンダースコア(_)を使うことができます。適当な文字、数値、記号を自由に組み合わせて、スクリプト内で「変数にすると宣言」すればよいのです。

ただし、先頭に数字を設定することは出来ません。また、アルファベットの大文字と子文字は別物として取り扱われますので注意してください。

シェル変数宣言の書式

変数=値

ココに注意

シェルスクリプトでは、変数への代入で「=」の後にスペースを入れることは出来ません! また、代入する値は、スペースや特殊記号などがシェルによって解釈されるのを防ぐため、基本的にシングル or ダブルクォート('')で囲むようにします。

シェル変数を宣言する

実際にコンソールへ、変数の宣言をしてみます。

site_name="Beエンジニア"

上記の代入の書式により、任意のシェル変数(変数名)に値を代入することができます。値を省略すると値が空文字列になりますが、シェル変数自体は定義されます。

実際にシェルスクリプトで記述するとこんな感じになります。

echo」コマンドは、メッセージなどを表示するコマンドです。「echo "メッセージ"」でメッセージを表示します。「echo "${変数名}"」で環境変数やシェル変数を表示する際にも使用します。

変数名には「変数を使う目的」を名前にしましょう。そうすれば読みやすいスクリプトになります。

シェル変数の参照は、変数名の頭に$を付けることによって行います。ただし、この際に値に含まれるスペースや*などのパス名展開の文字が解釈されてしまうのを防ぐため、基本的に全体をダブルクォート("")で囲みます。

シェル変数の参照

echo "${site_name}"1)
echo "$site_name"(2)

1:{}は、変数名の直後に別の文字列が続く場合、変数と文字列の区切りとして使用しています。
2:{}を省略することも可能です。ただしスクリプト可読性が下がります。

シェル変数の初期設定(=、-、?、+)

前章でもお伝えした通り、シェル変数は、変数名と代入する値を「=(イコール)」で結ぶことでシェル変数をセットします。

ですが、もっと柔軟に値を設定する方法もあります。

その変数が既に利用されているか、または、その変数は未設定(値がヌル)か、もしくは、まだ一度も使用されていない変数か、という条件によって代入する値や表示する内容を変えたりすることもできるのです。

コマンドの書式

${変数:値}(1)
${変数:値}(2)
${変数:メッセージ}(3)
${変数:値}(4)

1:変数がこれまで未使用、未設定の状態の時、値を代入して指定した値をそのまま返す。
2:変数がこれまで未使用、未設定の状態の時、値を代入しないまま指定した値をそのまま返す。
3:変数がこれまで未使用、未設定のときにメッセージの部分が表示されます。
4:変数に何らかの値が設定されているときに、値を取り替えて表示します。

表示される変数の値は、その時点で対象の変数を既に利用しているかどうかで違ってきます。

ココに注意

いずれも「:(コロン)」は省略可能です。「:」があれば、この変数がこれまで未使用(はじめて登場した場合)かヌル値がセットされているときに、後半(:以後)の処理を行います。「:」がなければ変数がこれまで未使用の場合に限って処理します。

「=」によるシェル変数の設定

変数がこれまで未使用、未設定の状態の時、値を代入して指定した値をそのまま返します。

# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:=bbb}

# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:=bbb}

実行結果は下記の通り

「-」によるシェル変数の設定

変数がこれまで未使用、未設定の状態の時、値を代入しないまま指定した値をそのまま返します。

# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:-bbb}

# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:-bbb}

実行結果は下記の通り

「?」によるシェル変数の設定

変数がこれまで未使用、未設定のときにメッセージの部分が表示されます。

# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:?"var is not set"}

# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:?"var is not set"}

実行結果は下記の通り

「+」によるシェル変数の設定

変数に何らかの値が設定されているときに、値を取り替えて表示します。

# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:+bbb}

# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:+bbb}

実行結果は下記の通り

特殊変数とは?

シェルには、特殊変数と呼ばれる特別なパラメータが用意されています。

特殊変数「$0」

# 起動中シェルスクリプト名を取得
echo "$0"

特殊変数「$0」は、起動されたシェルスクリプト名を参照します。シェルスクリプトを用いず直接コンソール上で実行した場合、「$0」はスクリプト名ではなく、呼び元シェルの名前になります。今回の場合は、Linuxの標準シェル「bash」が表示されています。

特殊変数「$@」

特殊変数「$@」は、シェルスクリプトやシェル関数の引数すべてをそのまま参照します。

「$@」をダブルクォートで括ると、引数をそれぞれ1個ずつダブルクォートで囲んで展開します。

#!/bin/sh

# 展開後の引数の数を数える
count=0
for arg in "$@"
do
    echo "$arg"
    count=$(expr $count + 1)
done

echo "展開後の引数の数は${count}です。"

結果として、引数の数は「"引数1" "引数2"」2つとして展開されています。

特殊変数「$*」

特殊変数「$*」は、シェルスクリプトやシェル関数の引数すべてを1つに連結して参照します。

「$*」をダブルクォートで括ると、引数全体を1個のダブルクォートで囲んだ状態に展開します。

#!/bin/sh

# 展開後の引数の数を数える
count=0
for arg in "$*"
do
    echo "$arg"
    count=$(expr $count + 1)
done

echo "展開後の引数の数は${count}です。"

結果として、引数の数は「"引数1 引数2"」1つとして展開されています。

思わぬトラブルを避けるために、スクリプト作成時の引数制御には「$*」ではなく、「$@」を使用しましょう。

特殊変数「$#」

特殊変数「$#」は、シェルスクリプトやシェル関数の引数の個数を参照します。

#!/bin/sh

# 引数の入力数を数える
echo "$#"

特殊変数「$?」

特殊変数「$?」は、「コマンド実行時の終了ステータス」を表わす変数です。

#!/bin/sh

# 「コマンド実行時の終了ステータス」を取得する
exit 255

直接コンソール上で「exit」コマンドを実行すると、コンソール自体が閉じてしまいますので注意してください。

特殊変数「$!」

特殊変数「$!」は、「&」を使ってコマンドをバックグラウンドで走らせた場合に、そのコマンドのプロセスIDがこの「$!」にセットされます。

# バッググラウンドプロセスのPIDを取得する
$ echo "$!"

特殊変数「$$」

特殊変数「$$」は、現在動作しているコマンドの「プロセスID」がセットされます。

#!/bin/sh

# 実行中のプロセスIDを取得する
echo "このスクリプトの実行PIDは$$です。"

特殊変数「$-」

特殊変数「$-」は、そのシェルの起動時のフラグや、「set」コマンドを使って設定したフラグの一覧がセットされています。

#現在 の オプション フラグを表示する
$ echo $-

特殊変数「$_」

特殊変数「$_」は、直前に実行したコマンドの最後の引数を参照します。

# 直前に実行したコマンドの最後の引数を取得する
$ echo $_

よく読まれている記事

1

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shellスクリプト

Copyright© Beエンジニア , 2020 All Rights Reserved.