⚠️ 記事内に広告を含みます。

シェル変数の設定・使い方 シェルスクリプトの作り方 基礎編②

シェルスクリプトの設定と使い方

シェルスクリプトを作る

シェルスクリプトとは一連のコマンドを組み合わせて記述した文章です。シェルスクリプトを作ることをシェルプログラミングと言ったりします。プログラミングと聞くと難しいイメージを抱くかもしれませんが、簡単に言えばシェルで一行ずつ打ち込むコマンドを連続して実行するようなものなので簡単です。

前回の記事でシェルについての概略とシェルプログラミンの簡単な概要を説明しました。ここでは実際にシェルスクリプトを作ってく上で必要になる前提の知識として変数について解説していきます。

変数の代入

変数の代入と聞くと数学っぽくて小難しく感じますが実際は単なる言葉の置き換えです。

A=電車

Aという文字を電車という意味にする「A=電車」これが代入です。Aに電車という言葉を代入していれば、コンピュータにAを表示しろと命令すると「電車」と表示されます。

この時、Aという文字は電車というA以外の意味を持っています。このAを変数といいます。

電車を代入した変数Aをechoコマンドを使って実際に画面上に出力させてみましょう。

echo “A”と打ってもシェルはAを変数として認識せずに、Aという文字と認識してしまいます。シェルに変数と認識させるためには、$を前に付けます。

変数に代入
変数に代入

echo “${A}”と実行するとシェルはAを変数Aとして認識、あらかじめ代入されていた「電車」という文字を表示します。これがいまいち何に使えるのかわからないというのが率直な感想だと思います。後々便利さが分かるので今はよくわからなくても大丈夫です。

変数の代入の仕方

変数に代入する方法はたくさんあります。変数:VARに対して値:almondを代入してみましょう。

  • VAR=almond

最もシンプルな代入の方法がイコールで結ぶことです。=の間にスペースは無しなので注意です。ちなみに空の値「null」を入れることもできます。上の例でVARにnullが入っている場合は代入されません。

  • VAR=” “

VARには空の値が代入されています。$VARを表示しても空なので何も表示されません。

  • VAR:=answer
    • VAR=”” → VAR=answerが代入
    • VAR=hello → VAR=helloのまま

「:=」はVARにnull以外のなんらかの値がセットされている場合はそのままで、それ以外はnullや初登場の変数の場合は代入するという意味です。

変数の値を確認しつつnullなら代入する方法

変数に代入した後、その値を確認する時は結構あると思います。

VAR="TEST"
echo "${VAR}"
(結果)TEST

これを一度にやります。やり方先ほど紹介した:=を利用します。

echo "${VAR:=TEST}"
(結果)TEST

VARが既に代入されていればその値が表示される(TESTは代入されない)

変数に値が入っていないか確認して、値がなければ代入、値があればそれを表示をそのまま直接書くならif文を使って変数の中身がnullか確認する文を書くと思いますが上記の方法ではもっとシンプルに書けますし、高速です。

#!/bin/bash
#VAR=Hello
if [ "$VAR" = "" ] ; then
  VAR=TEST
  echo "${VAR}"
else
  echo "${VAR}"
fi

#→上記がecho "${VAR:=TEST}" これだけで表現可能

代入の注意点

変数の文字の区切りを明示するために ${カッコでくくる}

代入した変数を文字列に組み込む時にいくつか問題にぶち当たった人がいると思います。

変数FRUIT=BANANAと代入したとします。

例えば「echo “I like a $FRUITcake”」と出力したとします。

おそらく狙いは「I like a BANANAcake」と出すことだと思いますが結果は「I like a 」しか出力されません。なぜでしょうか?

それは変数$FRUITではなく$FRUITcakeという変数と認識されているからです。このように変数の後ろに文字を書く場合はどこまでが変数なのかをしっかりと明示しておく必要があります。

「echo “I like a ${FRUIT}cake”」とすれば「I like a BANANAcake」とでます。

つまり、${変数}というように記述したほうが良いです。ちなみに変数として使用できる文字列は英数字と記号は「_」だけです。これ以外は区切りとみなされます。

echo “I like a $FRUITcake”ではだめですが、echo “I like a $FRUIT.cake”と「.」が入っていると「.」は変数の文字列として使えないので$FRUITが変数と認識されます。

環境変数をうまく使う $HOME $USER

シェルスクリプトの良いところは簡単にスクリプトを作成できる点と環境を選らばずに利用できる点です。シェルスクリプトはシェルを使って動かすプログラムなので、シェルによっては動かない場合があります。最も安全なものはborne shell通称Shです。shは多くのLinux/unixで使われています(Linuxはbash、unixはcシェル系がよく使われる)。

とはいえシェルプログラムはインストールされているので、特別なインストールなしにシェルスクリプトを実行できます。

同じLinuxディストリビューションでも環境ごとに違う項目のひとつがユーザーに関する設定です。ユーザーの名前は人によって違うので、ユーザのディレクトリの名前が違います。例えば ユーザーkomeyanのホームディレクトリ(/home/komeyan)にその日の日付情報が入ったファイルを作るというスクリプトを書くと、ユーザーがkomeyan以外の場合エラーになります。

$ date >  /home/komeyan/`date +%Y%m%d`.txt
→ユーザーにkomeyanがいないとエラーになる

こんな時に環境変数が役に立ちます。システムで設定されている環境変数の名前はどの環境でも共通しているからです。

環境変数USERにはログインしているユーザー名が入ります。ユーザーがtakashiの場合は「USER=takashi」となります。HOMEという環境変数はそのユーザーのホームディレクトリのパスが入っています。

先ほどエラーが出てしまうコマンドも具体的ユーザー名を入れるのではなく、環境変数で指定することによってエラーが出なくなります。

$ date >  /home/$USER/`date +%Y%m%d`.txt
→その環境のユーザが入るのでエラーが出ない

長いコマンドを二行に分割して書く方法

長い絶対パスやパイプでつないだコマンドは一行がとても長くなることがありますこれを複数行にわたって記述したいときは「\」をいれます。これを入れると次の行に書いたコマンドも一行で書いたのと同じ扱いになります。

$ date > /home/komeyan/`date\
+%Y%m%d`.txt

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です