シェル上ではシェル変数によって変数を扱うことが可能です。また、シェル変数以外に、特殊変数と呼ばれる一種の変数が存在します。
この記事でわかること
- シェル変数とは?
- 特殊変数とは?
極稀に変数の中にコマンドを代入して実行させたい、つまり「2重展開」を行いたいと検索してこのページへたどり着く方がいるようです。2重展開については「eval」コマンドを参照してください。
変数とは?
シェルには「シェル変数」と「特殊変数」が機能として予め用意されています。シェル変数は環境変数としてエクスポートすることが可能です。
シェル変数とは?
変数とは、値(文字や数値)を入れて置くための箱です。
シェルでは、シュル変数によって値を一時的に保管しておくことが可能です。後で必要な時にシェル変数から値を取り出します。簡単に言うと、パソコンで処理をするときに、データを代入して効率的に処理をする箱といった認識で良いでしょう。
例えば、ユーザがOSにログインした時、起点となるディレクトリをホームディレクトリといいますが、これは$HOMEというシェル変数の値としてセットされています。いま無理におぼなくても、シェルを扱っているうちに、自然に覚えていくことになりますので、ご安心ください。
変数名についてのルール
シェル変数の名前には、アルファベット、数字、アンダースコア(_)を使うことができます。適当な文字、数値、記号を自由に組み合わせて、スクリプト内で「変数にすると宣言」すればよいのです。
ただし、先頭に数字を設定することは出来ません。また、アルファベットの大文字と子文字は別物として取り扱われますので注意してください。
シェル変数宣言の書式
変数=値
ココに注意
シェルスクリプトでは、変数への代入で「=」の後にスペースを入れることは出来ません! また、代入する値は、スペースや特殊記号などがシェルによって解釈されるのを防ぐため、基本的にシングル or ダブルクォート('')で囲むようにします。
シェル変数を宣言する
実際にコンソールへ、変数の宣言をしてみます。
site_name="Beエンジニア"
上記の代入の書式により、任意のシェル変数(変数名)に値を代入することができます。値を省略すると値が空文字列になりますが、シェル変数自体は定義されます。
実際にシェルスクリプトで記述するとこんな感じになります。
1 2 3 |
[root@CentOS7 ~]# site_name="Beエンジニア" [root@CentOS7 ~]# echo ${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}
実行結果は下記の通り
1 2 3 4 5 6 7 8 9 10 11 |
[root@CentOS7 bin]# var= [root@CentOS7 bin]# echo ${var:=bbb} bbb 👈 変数が未設定の場合、値を代入して指定した値を返す。 [root@CentOS7 bin]# echo ${var} bbb 👈 値が代入されている。 ------------------------------------------------------------------ [root@CentOS7 bin]# var=aaa [root@CentOS7 bin]# echo ${var:=bbb} aaa 👈 変数に値が設定されている為、設定された値を返している。 [root@CentOS7 bin]# echo ${var} aaa |
「-」によるシェル変数の設定
変数がこれまで未使用、未設定の状態の時、値を代入しないまま指定した値をそのまま返します。
# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:-bbb}
# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:-bbb}
実行結果は下記の通り
1 2 3 4 5 6 7 8 9 10 11 |
[root@CentOS7 bin]# var= [root@CentOS7 bin]# echo ${var:-bbb} bbb 👈 変数が未設定の場合、値を代入せず指定した値を返す。 [root@CentOS7 bin]# echo ${var} 👈 値は代入されていない。 ------------------------------------------------------------------ [root@CentOS7 bin]# var=aaa [root@CentOS7 bin]# echo ${var:-bbb} aaa 👈 変数に値が設定されている為、設定された値を返している。 [root@CentOS7 bin]# echo ${var} aaa |
「?」によるシェル変数の設定
変数がこれまで未使用、未設定のときにメッセージの部分が表示されます。
# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:?"var is not set"}
# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:?"var is not set"}
実行結果は下記の通り
1 2 3 4 5 6 7 8 9 10 11 |
[root@CentOS7 bin]# var= [root@CentOS7 bin]# echo ${var:?"var is not set"} -bash: var: var is not set 👈 値が未設定の場合のみ、メッセージを表示する。 [root@CentOS7 bin]# echo ${var} 👈 値は代入されていない。 ------------------------------------------------------------------ [root@CentOS7 bin]# var=aaa [root@CentOS7 bin]# echo ${var:?"var is not set"} aaa [root@CentOS7 bin]# echo ${var} aaa |
「+」によるシェル変数の設定
変数に何らかの値が設定されているときに、値を取り替えて表示します。
# 変数${var}へ「」を代入した場合(未使用の状態)
var=
echo ${var:+bbb}
# 変数${var}へ「aaa」を代入した場合
var=aaa
echo ${var:+bbb}
実行結果は下記の通り
1 2 3 4 5 6 7 8 9 10 11 |
[root@CentOS7 bin]# var= [root@CentOS7 bin]# echo ${var:+bbb} 👈 値は代入されていない。 [root@CentOS7 bin]# echo ${var} 👈 値は代入されていない。 ------------------------------------------------------------------ [root@CentOS7 bin]# var=aaa [root@CentOS7 bin]# echo ${var:+bbb} bbb 👈 値が設定済みの場合のみ、値を取り換えて表示する。 [root@CentOS7 bin]# echo ${var} aaa 👈 元の値に変更はない。 |
特殊変数とは?
シェルには、特殊変数と呼ばれる特別なパラメータが用意されています。
特殊変数「特殊変数「$0」
」
# 起動中シェルスクリプト名を取得
echo "$0"
1 2 |
[root@CentOS7 bin]# echo "$0" -bash |
特殊変数「$0」は、起動されたシェルスクリプト名を参照します。シェルスクリプトを用いず直接コンソール上で実行した場合、「$0」はスクリプト名ではなく、呼び元シェルの名前になります。今回の場合は、Linuxの標準シェル「bash」が表示されています。
特殊変数「$@」
特殊変数「$@」は、シェルスクリプトやシェル関数の引数すべてをそのまま参照します。
「$@」をダブルクォートで括ると、引数をそれぞれ1個ずつダブルクォートで囲んで展開します。
#!/bin/sh
# 展開後の引数の数を数える
count=0
for arg in "$@"
do
echo "$arg"
count=$(expr $count + 1)
done
echo "展開後の引数の数は${count}です。"
1 2 3 4 |
[root@CentOS7 bin]# sh func.sh 引数1 引数2 引数1 引数2 展開後の引数の数は2です。 |
結果として、引数の数は「"引数1" "引数2"」2つとして展開されています。
特殊変数「$*」
特殊変数「$*」は、シェルスクリプトやシェル関数の引数すべてを1つに連結して参照します。
「$*」をダブルクォートで括ると、引数全体を1個のダブルクォートで囲んだ状態に展開します。
#!/bin/sh
# 展開後の引数の数を数える
count=0
for arg in "$*"
do
echo "$arg"
count=$(expr $count + 1)
done
echo "展開後の引数の数は${count}です。"
1 2 3 |
[root@CentOS7 bin]# sh func.sh 引数1 引数2 引数1 引数2 展開後の引数の数は1です。 |
結果として、引数の数は「"引数1 引数2"」1つとして展開されています。
思わぬトラブルを避けるために、スクリプト作成時の引数制御には「$*」ではなく、「$@」を使用しましょう。
特殊変数「$#」
特殊変数「$#」は、シェルスクリプトやシェル関数の引数の個数を参照します。
#!/bin/sh
# 引数の入力数を数える
echo "$#"
1 2 |
[root@CentOS7 bin]# sh func.sh 引数1 引数2 2 |
特殊変数「$?」
特殊変数「$?」は、「コマンド実行時の終了ステータス」を表わす変数です。
#!/bin/sh
# 「コマンド実行時の終了ステータス」を取得する
exit 255
1 2 3 4 |
[root@CentOS7 bin]# sh func.sh func.sh [root@CentOS7 bin]# echo $? 255 |
直接コンソール上で「exit」コマンドを実行すると、コンソール自体が閉じてしまいますので注意してください。
特殊変数「$!」
特殊変数「$!」は、「&」を使ってコマンドをバックグラウンドで走らせた場合に、そのコマンドのプロセスIDがこの「$!」にセットされます。
# バッググラウンドプロセスのPIDを取得する
$ echo "$!"
1 2 3 4 |
[root@CentOS7 bin]# sleep 15 & [1] 15995 [root@CentOS7 bin]# echo $! 15995 |
特殊変数「$$」
特殊変数「$$」は、現在動作しているコマンドの「プロセスID」がセットされます。
#!/bin/sh
# 実行中のプロセスIDを取得する
echo "このスクリプトの実行PIDは$$です。"
1 2 |
[root@CentOS7 bin]# sh func.sh このスクリプトの実行PIDは15663です。 |
特殊変数「$-」
特殊変数「$-」は、そのシェルの起動時のフラグや、「set」コマンドを使って設定したフラグの一覧がセットされています。
#現在 の オプション フラグを表示する
$ echo $-
1 2 |
[root@CentOS7 bin]# echo $- himBH |
特殊変数「$_」
特殊変数「$_」は、直前に実行したコマンドの最後の引数を参照します。
# 直前に実行したコマンドの最後の引数を取得する
$ echo $_
1 2 3 |
[root@CentOS7 bin]# sh func.sh 引数1 引数2 [root@CentOS7 bin]# echo $_ 引数2 |
Shellスクリプト基礎知識(全11記事+1)
├─シェルスクリプトの基本事項!
├─変数と特殊変数について!
├─演算子「算術演算子」「比較演算子」について!
├─条件分岐「if」「case」について!
├─ループ処理「for」「while」について!
├─文字列置換「bash」「sed」について!
├─複数行のテキスト出力!ヒアドキュメントについて!
├─書式?戻り値?シェルスクリプト内の関数について!
├─シェルの組み込みコマンドについて!
├─クォートとは?コマンド置換とは?実現方法と内容の違いについて!
└─リダイレクトとは?標準入力・出力、標準エラー出力等について!
(補足)シェルスクリプトの設計書とは?必要な項目や書き方等を解説!