サーバ管理者のためのプログラミング入門(シェルプログラミング基礎3~シェルスクリプト変数その1) [サーバ管理者のプログラミング]
続いて、シェルスクリプトプログラミングにおいて…いや、ありとあらゆるプログラミングにおいて欠かせない「変数」について説明しよう。
「変数」とは、何らかの数値や文字列を一時的に格納する領域…と覚えてもらいたい。要するに、1とか2とか3とか…というような数値データ、ユーザー名とかサーバ名とかディレクトリ名とかの文字の羅列というような文字列データなどを一時的に格納することができる。
「変数」がどのような局面で役に立つか。判りやすい例でいえば、「処理内容は全く同じだが、処理対象となるサーバが違う」とかそんなケース。以前、「yum update」をいろんなサーバで実行する例を見てもらったが、まさにあんな処理を行いたい場合などに「変数」が役に立つ。
あるいは、あるファイルを処理の対象にすると仮定する。シェルスクリプトのあちこちでそのファイルを使用したいなんてケースも、「変数」が役に立つ。というのも、ファイル名をシェルスクリプトのあっちこっちで書き並べておくと、「ファイル名(ファイルの置いてある場所)が変更になりました…」なんてケースに泣きを見ることがあるのである。(エディタの置換機能で一斉に置き換えればいいじゃん!…なんていう人もいるかもしれない。が、ファイルが1個ならそれでも良いが、2個3個…となってくるとリスクが飛躍的に大きくなる)
それでは、変数の使い方についてざっと説明しておこう。
実は、コマンドラインインタプリタ(shとかbashとかkshとかcshとか…)は日常的に「変数」を活用している。もしかしたらすでにその「変数」に触れている可能性も高い。
ためしに、プロンプトから、「set」コマンドを実行してみると、こんなような表示が出ると思う。
[root@kagami ~]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=90
DIRSTACK=()
(途中省略)
TERM=xterm
UID=0
USER=root
_=USERNAME
consoletype=pty
これは、bashで実行した結果。表示内容としては、「ナントカ=カントカ」というならびになっている。(一部、配列変数を使用しているため風変わりな表示内容もあるが、そこはとりあえず読み飛ばしてもらいたい)
たとえば、「BASH=/bin/bash」という内容(おそらく1行目)は、
変数「BASH」の内容は、「/bin/bash」ですよ
という内容になっている。
サーバ管理者としておそらく身近な変数の一つに、「PATH」が挙げられる。この変数はコマンドを入力した際に、そのコマンドが置かれているディレクトリを検索する対象を列挙している。
[root@kagami ~]# set | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
単にコマンド名が入力された場合(たとえば「ls」とか)/usr/binとか/usr/sbinとかその辺のディレクトリを探してコマンドを実行するに必要なファイルを探し出す場所をこの変数は保持している。
今、変数「PATH」の内容を確認するためにsetコマンドとgrepコマンドを使用したが、変数の内容を確認する正しい方法があるので、まずはそれを紹介する。
1.変数の参照方法
シェル変数を参照するには、「$」記号に続けて変数名を記述することで、その変数を参照できる。ここでいう「参照」とは、変数の中身をいきなり表示するという意味ではないことに注意が必要。
では、先ほど表示してみた変数「PATH」の内容を参照・表示してみるにはどうすればよいか。「$」記号に続けて変数名を記述する…ということなので、変数PATHを参照する際には「$PATH」という指定をすればよいことになる。ただ、これをこのままコマンドラインから入力しても表示されるわけではない。ここでは、「echo」コマンドと組み合わせることで表示することになる。
[root@kagami ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
変数PATHの中身が表示された。setコマンドでの実行結果と微妙に異なるが、setコマンドは「変数名=内容」という書式で、全ての環境変数が表示されていた。こちらは指定した変数の内容「だけ」が表示されている。
なお、変数名を記述する際、「{」と「}」とで囲むケースがある。詳しくは別途解説するが、「$PATH」と指定するところを「${PATH}」と記述してもよいし、またそのように指定しなければならなくなるケースも存在することを覚えておいて欲しい。
2.変数に値を代入(セット)する
変数の内容を参照できるようになったところで、今度は変数に何らかの値・情報を代入(セット)してみよう。
変数への代入方法は、中学校・高校の数学の授業で散々見た(はずの)記述方法と同じ。「変数=値」という記述方法をとる。
それでは、ここでは新たに変数「TEST」に「1」を代入してみる。その記述方法は、「TEST=1」である。
なお、ここで重要な注意事項がある。変数名とイコール、イコールと値の間には空白(スペースやタブ)を入れないこと。空白を入れずに続けざまに記述しなければならない。
では、実際に試してみよう。
[root@kagami ~]# echo $TEST
[root@kagami ~]# TEST=1
[root@kagami ~]# echo $TEST
1
代入する前に、「echo $TEST」を実行してみた。何も表示されていないが、これはまだ変数「TEST」に何も代入されていないことを示している。
そして変数「TEST」に1を代入。続けて再度変数の内容を参照してみると、ちゃんと「1」が表示され、変数「TEST」に値が代入されていることがわかる。
なお、変数に代入できるデータはなにも数値とは限らない。文字列を格納することもできる。
[root@kagami ~]# TEST=hogehoge
[root@kagami ~]# echo $TEST
hogehoge
変数「TEST」に、「hogehoge」という文字列を代入した例。ちゃんと文字列が格納されていることが確認できる。
変数の内容をカラッポにしたいというケースもたまに出てくる。そのような場合は「""」(ダブルクォーテーションを2個続けたもの)を代入することが一般的だ。「TEST=""」という具合に。なお、「''」(シングルクォーテーションを2個続けたもの)でもよい。
3.変数そのものを削除したい。
それほど多くは無いかもしれないが、処理の内容・方法によっては「変数そのものを削除したい」ということもあるかもしれないので、その方法も紹介しておく。
「unset」コマンドを用いると、その変数を削除することができる。
先ほど紹介した、「TEST=""」の場合、変数の中身がカラッポになるだけで、変数そのものは残る。
[root@kagami ~]# TEST=""
[root@kagami ~]# set | grep TEST
TEST=
unsetコマンドを用いた場合は、変数そのものが無くなる。
[root@kagami ~]# unset TEST
[root@kagami ~]# set | grep TEST
_=TEST
「_=TEST」とか表示はあるものの、「TEST=ナントカ」という表示が消えていることが判る。これは変数「TEST」そのものが存在していないことを意味している。
unsetコマンドで変数名を指定する際は「$」記号は不要である。
「変数」とは、何らかの数値や文字列を一時的に格納する領域…と覚えてもらいたい。要するに、1とか2とか3とか…というような数値データ、ユーザー名とかサーバ名とかディレクトリ名とかの文字の羅列というような文字列データなどを一時的に格納することができる。
「変数」がどのような局面で役に立つか。判りやすい例でいえば、「処理内容は全く同じだが、処理対象となるサーバが違う」とかそんなケース。以前、「yum update」をいろんなサーバで実行する例を見てもらったが、まさにあんな処理を行いたい場合などに「変数」が役に立つ。
あるいは、あるファイルを処理の対象にすると仮定する。シェルスクリプトのあちこちでそのファイルを使用したいなんてケースも、「変数」が役に立つ。というのも、ファイル名をシェルスクリプトのあっちこっちで書き並べておくと、「ファイル名(ファイルの置いてある場所)が変更になりました…」なんてケースに泣きを見ることがあるのである。(エディタの置換機能で一斉に置き換えればいいじゃん!…なんていう人もいるかもしれない。が、ファイルが1個ならそれでも良いが、2個3個…となってくるとリスクが飛躍的に大きくなる)
それでは、変数の使い方についてざっと説明しておこう。
実は、コマンドラインインタプリタ(shとかbashとかkshとかcshとか…)は日常的に「変数」を活用している。もしかしたらすでにその「変数」に触れている可能性も高い。
ためしに、プロンプトから、「set」コマンドを実行してみると、こんなような表示が出ると思う。
[root@kagami ~]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=90
DIRSTACK=()
(途中省略)
TERM=xterm
UID=0
USER=root
_=USERNAME
consoletype=pty
これは、bashで実行した結果。表示内容としては、「ナントカ=カントカ」というならびになっている。(一部、配列変数を使用しているため風変わりな表示内容もあるが、そこはとりあえず読み飛ばしてもらいたい)
たとえば、「BASH=/bin/bash」という内容(おそらく1行目)は、
変数「BASH」の内容は、「/bin/bash」ですよ
という内容になっている。
サーバ管理者としておそらく身近な変数の一つに、「PATH」が挙げられる。この変数はコマンドを入力した際に、そのコマンドが置かれているディレクトリを検索する対象を列挙している。
[root@kagami ~]# set | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
単にコマンド名が入力された場合(たとえば「ls」とか)/usr/binとか/usr/sbinとかその辺のディレクトリを探してコマンドを実行するに必要なファイルを探し出す場所をこの変数は保持している。
今、変数「PATH」の内容を確認するためにsetコマンドとgrepコマンドを使用したが、変数の内容を確認する正しい方法があるので、まずはそれを紹介する。
1.変数の参照方法
シェル変数を参照するには、「$」記号に続けて変数名を記述することで、その変数を参照できる。ここでいう「参照」とは、変数の中身をいきなり表示するという意味ではないことに注意が必要。
では、先ほど表示してみた変数「PATH」の内容を参照・表示してみるにはどうすればよいか。「$」記号に続けて変数名を記述する…ということなので、変数PATHを参照する際には「$PATH」という指定をすればよいことになる。ただ、これをこのままコマンドラインから入力しても表示されるわけではない。ここでは、「echo」コマンドと組み合わせることで表示することになる。
[root@kagami ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
変数PATHの中身が表示された。setコマンドでの実行結果と微妙に異なるが、setコマンドは「変数名=内容」という書式で、全ての環境変数が表示されていた。こちらは指定した変数の内容「だけ」が表示されている。
なお、変数名を記述する際、「{」と「}」とで囲むケースがある。詳しくは別途解説するが、「$PATH」と指定するところを「${PATH}」と記述してもよいし、またそのように指定しなければならなくなるケースも存在することを覚えておいて欲しい。
2.変数に値を代入(セット)する
変数の内容を参照できるようになったところで、今度は変数に何らかの値・情報を代入(セット)してみよう。
変数への代入方法は、中学校・高校の数学の授業で散々見た(はずの)記述方法と同じ。「変数=値」という記述方法をとる。
それでは、ここでは新たに変数「TEST」に「1」を代入してみる。その記述方法は、「TEST=1」である。
なお、ここで重要な注意事項がある。変数名とイコール、イコールと値の間には空白(スペースやタブ)を入れないこと。空白を入れずに続けざまに記述しなければならない。
では、実際に試してみよう。
[root@kagami ~]# echo $TEST
[root@kagami ~]# TEST=1
[root@kagami ~]# echo $TEST
1
代入する前に、「echo $TEST」を実行してみた。何も表示されていないが、これはまだ変数「TEST」に何も代入されていないことを示している。
そして変数「TEST」に1を代入。続けて再度変数の内容を参照してみると、ちゃんと「1」が表示され、変数「TEST」に値が代入されていることがわかる。
なお、変数に代入できるデータはなにも数値とは限らない。文字列を格納することもできる。
[root@kagami ~]# TEST=hogehoge
[root@kagami ~]# echo $TEST
hogehoge
変数「TEST」に、「hogehoge」という文字列を代入した例。ちゃんと文字列が格納されていることが確認できる。
変数の内容をカラッポにしたいというケースもたまに出てくる。そのような場合は「""」(ダブルクォーテーションを2個続けたもの)を代入することが一般的だ。「TEST=""」という具合に。なお、「''」(シングルクォーテーションを2個続けたもの)でもよい。
3.変数そのものを削除したい。
それほど多くは無いかもしれないが、処理の内容・方法によっては「変数そのものを削除したい」ということもあるかもしれないので、その方法も紹介しておく。
「unset」コマンドを用いると、その変数を削除することができる。
先ほど紹介した、「TEST=""」の場合、変数の中身がカラッポになるだけで、変数そのものは残る。
[root@kagami ~]# TEST=""
[root@kagami ~]# set | grep TEST
TEST=
unsetコマンドを用いた場合は、変数そのものが無くなる。
[root@kagami ~]# unset TEST
[root@kagami ~]# set | grep TEST
_=TEST
「_=TEST」とか表示はあるものの、「TEST=ナントカ」という表示が消えていることが判る。これは変数「TEST」そのものが存在していないことを意味している。
unsetコマンドで変数名を指定する際は「$」記号は不要である。
コメント 0