プログラミングになくてはならないのが変数だ。シェルスクリプトにも変数は存在する。
このページでは、Linuxシェルスクリプトでの変数の使い方についてご紹介する。シェルスクリプト初心者の方は参考にしてほしい。
変数とは?
変数とは、「変化する値をいれる箱」である。
プログラミングでは常にこの箱に数字や値や配列といったものを入れて使う。入れなくても使えるのだが、入れた方が圧倒的に便利なのだ。
例えば、"おはようございます。こんにちは。ありがとうございます。"という文章があったとしよう。それを何度も表示させるプログラムがある。これを何度も書くと非常に面倒ではないだろうか?
この文章をaという箱に入れてしまえば、「aの中身を表示」で終わる。途中で"おはようございます。こんにちは。こんばんは"に文章を変えたいと思っても、初めに入れる部分だけ変更すればいい。
このように、プログラムでは変化するもの、その可能性があるものはすべて変数に放り込んでいくのが普通だ。
変数の使い方
実際に変数を作成、代入してみよう。
シェルスクリプトを作らなくても実験できる。Linuxのシェルはインタプリタなのでその場で変数の宣言や参照が可能なので、とりあえずいつものようにコマンドを打つ場所で次のように打ってみよう。
$ STRING=hello_world
とすると「STRING」に「hello_world」代入される。このとき「=」の右辺、左辺ともにスペースをいれてはいけない。「=」のところに空白をあけるとSTRINGが変数ではなくコマンドとして誤解されるためだ。
次に値を参照してみよう。変数名の前に「$」をつけることで中身の値を参照できる。例えばさきほどのSTRINGに$をつける「$STRING」とすると中の値が参照できる。単純に中身を確認したい場合は「echo」を使うとよい。
$ echo $STRING
とするとhello_worldと表示されるはずだ。
スクリプトにしてみる
続いてスクリプトでも見てみよう。
vi test-variable.sh
1 2 3 4 5 |
#!/usr/bin/bash #変数作成 STRING=hello_world #参照 echo $STRING |
変数名のルール
変数を作成するとき、基本的に任意の名前をつけることが出来るが幾つかの例外があるので気をつけていただきたい。
例外のルールは以下の二つだ。
- 英数字と_を使用すること
- 先頭に数字をもってきてはいけない
この二つをまもっていればユーザが任意の変数名をつけてよい「 」(スペース)「-」ハイフン)なども使えないので気をつけよう。また大文字小文字は区別される。
ほか気をつけるというと変数のネーミングだ。
変数名の付け方に厳格なルールはないが、「その変数がなにを目的につくられているのか?」ということを意識して名前をつけよう。昨今では補完入力環境が整っているため、長い名前の変数にしても問題にならないことが多い。他人が読むにしろ、自分が読むにしろ、わかりやすい名前の方が可読性が高まる。
逆に一文字の変数などはループの数を数えるカウンタぐらいだろう。
実行時の引数に関して
実行するときスクリプトの状態を保持する変数が存在する。これも時には便利に使えるだろう。
- $0 スクリプト名
- $# 渡されたパラメータの個数
- $$ プロセスID
- $1,$2,..$N パラメータ
- $* クリプト実行時、指定されたパラメータ全てが設定される変数。
- $@ 基本的に$*と同じ、“”で囲んだときの展開の動作が異なる。
これらを使用すると与えられているコマンドライン引数が把握できる。
実際にわたされたパラメータは幾つか、値はどうなのか?などの情報である。特にスクリプトにわたされた引数などを使用したいときによく使うので、あたまの片隅にいれておこう。
vi test-parameters.sh
1 2 3 4 5 6 7 8 |
#!/usr/bin/bash #各種パラメータ変数参照 echo $0 echo $# echo $$ echo $1 echo $* echo $@ |
変数の範囲
bashシェルスクリプトの場合、変数は基本的に大域変数、グローバル変数だ。グローバル変数とはどこからでも使うことができる変数のことをいう。
よくわからなければ、とりあえず気にしなくて大丈夫だ。
配列を使う場合
こちらも少し高度になる。プログラムには配列と呼ばれるものがよく使われる。下記のように箱が並んだものだ。
上についた数字が添え字だ。0番目の箱、1番目の箱、という意味になる。0からスタートするのには注意しよう。
配列とは「変数の塊」だ。これも繰り返し処理と組み合わせると力を発揮する。
$ LIST_1=(aa bb cc)
とすると配列な変数が作成できる。値を参照するときは
$ echo ${LIST_1[0]}
$ echo ${LIST_1[1]}
$ echo ${LIST_1[2]}
などとすると参照できる。aa bb ccがそれぞれ箱に入って、[0]で0番目の箱の値が、[1]で1番目の箱の値が、[2]で2番目の箱の値が取得できる。
配列の要素へアクセスするために{}で変数を囲むことに注意しよう{}をなくしてしまうと配列の先頭の値と[0]などが連結された値が出力されてしまうからだ。
vi test-list.sh
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/bash #配列の作成 LIST_1=(aa bb cc) #順次参照 echo ${LIST_1[0]} echo ${LIST_1[1]} echo ${LIST_1[2]} #これは間違い # echo $LIST_1[0] |
「declare」と「typeset」
この2つのコマンドは名前が違うが同じ動作をするのでどちらを使用してもかまわない。
今回は「declare」を使用することにする。declareを使う場合は「明示的にその変数が何を入れる変数なのか」を示すときに使う。数字なのか、配列なのか、などだ。
$ declare -i NUM=1
などとして使う、今回はNUMを数値の変数として決め打ちするために「-i」オプションを使用した。他
- -a 変数を配列とする
- -f 変数を関数とする
- -i 変数を数値とする。
- -r 変数を読み出し専用とする。
- -x 変数をエクスポートする。
- -p 変数の値を表示する。
などがある。
まとめ
このページではシェルスクリプトの変数についてまとめてきた。
シェルスクリプト独自で使える変数もあり、これらも有用だ。この機会にぜひ覚えていただければと思う。