Shellスクリプト

【Shellスクリプト】変数と演算子について理解しよう!

2020年4月15日

変数とは?

シェルには、「シェル変数」と「特殊変数」が機能として予め用意されています。

シェル変数とは?

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

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

例えば、ユーザが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」:シェルスクリプト名
$@」:すべての引数リスト
$*」:すべての引数リスト
$#」:引数の数
$?」:リターンコード取得
$!」:バッググラウンドプロセスのPID
$$」:実行コマンドのPID
$-」:シェルの実行オプション
$_」:直前に実行したコマンドの最後の引数

各特殊変数については、後程詳しく解説していきます。

演算子とは?

演算子っていきなり言われると分からない人もいると思いますので、簡単に説明しますね。

具体的には、足し算「+」や引き算「-」、掛け算「×(*)」、割り算「÷(/)」などの計算を行うときの記号ありますよね?これらの記号をコンピューターが使うときに演算子という名前になるんです。

四則演算子とは?

四則演算って普段の生活をしているときに当たり前に暗算してしまっていると思うんですけど、コンピューターに計算させるためにはプログラムをちゃんと書いてあげないといけないんですね。なので、これからどんなシェルスクリプトを書けばいいのかを紹介していきます。

四則演算子 使用例 意味
+ a + b a に b を加える(加法)
- a - b a から b を引く(減法)
* a * b a に b をかける(乘法)
/ a / b a を b で割る(除法)

足し算

# aの中身とbの中身を足した結果を表示します。
a=1
b=1

echo $((a + b))

引き算

# aの中身とbの中身を引いた結果を表示します。
a=1
b=1

echo $((a - b))

掛け算

# aの中身とbの中身を掛けた数字を表示します。
a=1
b=1

echo $((a * b))

割り算

# aの数字をbで割り算した結果を変数を参照して表示します。
a=1
b=1

echo $((a / b))

比較演算子とは?

先程は四則演算の紹介をしましたが、演算子というのは「四則演算子」だけでなく「比較演算子」という、演算子の左右にあるデータを比較をするための演算子もあるんです。

比較演算子はどういうときに使われているのかというと、入力された文字列が正しいかを確認したいときや、if分やswitch分といった制御構文を組み合わせて繰り返し処理をするときに使われています。

比較演算子 使用例 意味
-eq a -eq b aとbが等しければ真
-ge a -ge b aがbより大きい、もしくは等しければ真
-gt a -gt b aがbより大きければ真
-le a -le b aがbより小さい、もしくは等しければ真
-lt a -lt b aがb未満であれば真
-ne a -ne b aとbが等しくなければ真

戻り値比較(if-else構文)

この比較演算子は、シェルスクリプトを作成する上で、欠かすことは出来ないモノです。比較演算子を使わないシェルスクリプトはまず無いといってよいでしょう。

下記に、最もよく使うであろう「リターンコード」の比較判定文を試してみます。なんだったらこの構文を丸ごと暗記しても良いくらいよく使います。

echo "Hello World"
if [ $? -eq 0 ]; then
  echo "コマンドは、正常に実行しました。"
fi

文字列比較とは?

シェルスクリプトで文字列を比較する為に必要なプログラムは、たった1行書くだけで十分です。しかし、if-else文のスクリプトを作成する場合は多少プログラムを記述する必要があります。

下記の一覧は文字列を比較するために必要な演算子をまとめたものです。

演算子 使用例 意味
-n -n 文字列 文字列の長さが0より大きければ真
-z -z 文字列 文字列の長さが0であれば真
= 文字列A = 文字列B 文字列Aと文字列Bが等しければ真
!= 文字列A != 文字列B 文字列Aと文字列Bが等しくなければ真

ココに注意

シェルスクリプトの比較式には「比較演算子」の左右に空白(半角スペース)が必要です(代入とは別)。また、比較する変数を「ダブルクォーテーション」で囲まないと、変数が空のときに構文エラーとなってしましますので注意してください。

文字列比較(テストコマンド[ ])

具体的に、演算子をどのように使っているのかを紹介してみましょう。今回は「ワンライナー」でシェルを記述してみます。

ワンライナー?

ワンライナーとは、スクリプト構文を、インデントや改行など一切行わず、1行にすべて詰め込む記述法を指します。ベテランエンジニアが良く用いる記述法です。

条件文の書式

[ 条件文 ] && コマンド1 || コマンド2

a="文字列1"
b="文字列2"
echo `[ "$a" = "$b" ] && echo "同じ文字列ですね" || echo "違う文字列ですね"`

特殊変数とは?

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

特殊変数「$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

独立前は、誰もが不安でいっぱい。近い将来、フリーランスとして独立を考えている方が独立初期に躓かないために「独立前にやるべきことチェックリスト」をご紹介します。 当記事は前編となる「お金まわり編」。全て ...

2

ゲームなどのエンタメ分野での導入が進んでいるVR。言葉自体は耳にしたことがあっても、その意味を詳しく知らないという人も多いのではないでしょうか。また、次世代の新たな技術をビジネスに積極的に活用していく ...

3

フリーランスの確定申告には、青色申告と白色申告の2種類があります。いったいどちらの申告方法を選ぶべきなのでしょうか。 この記事では、青色申告と白色申告、それぞれのメリット・デメリットを把握することでベ ...

4

フリーランスの仕事場は、自宅をはじめとし、カフェや図書館、コワーキングスペースなど自由に選べます。しかし全ての場所で100%集中ができるどうかは、人それぞれです。どのような環境が自身の仕事場として快適 ...

5

フリーランスのITエンジニアとして、一番難しいのは「自己管理」と言えるでしょう。 自分の体調管理はもとより、仕事のスケジュール等すべて自分で管理します。もちろんフリーランスに有給休暇等ありませんから休 ...

-Shellスクリプト

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