シェルは「+」や「-」を使用して「〇〇の演算をする」場合に表す記号を指します。演算子には大きく分けて「算術演算子」と「比較演算子」の2つに分かれます。
この記事では、「算術演算子」と「比較演算子」について説明していきます。
演算子とは?
演算子っていきなり言われると分からない人もいると思いますので、簡単に説明します。
具体的には、足し算「+」や引き算「-」、掛け算「×(*)」、割り算「÷(/)」などの計算を行うときの記号ありますよね?これらの記号をコンピューターが使う時に演算子を使います。また、値や文字、モノ(オブジェクト)などを比較する場合にも、演算子を使用します。
算術演算子とは?
算術演算って普段の生活をしているときに当たり前に暗算してしまっていると思うんですけど、コンピューターに計算させるためにはプログラムをちゃんと書いてあげないといけないんですね。なので、これからどんなシェルスクリプトを書けばいいのかを紹介していきます。
算術演算子 | 使用例 | 意味 |
+ | a + b | a に b を加える(加法) |
- | 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))
1 2 3 4 |
[root@CentOS7 ~]# a=1 [root@CentOS7 ~]# b=1 [root@CentOS7 ~]# echo $((a + b)) 2 |
引き算
# aの中身とbの中身を引いた結果を表示します。
a=1
b=1
echo $((a - b))
1 2 3 4 |
[root@CentOS7 ~]# a=1 [root@CentOS7 ~]# b=1 [root@CentOS7 ~]# echo $((a - b)) 0 |
掛け算
# aの中身とbの中身を掛けた数字を表示します。
a=1
b=1
echo $((a * b))
1 2 3 4 |
[root@CentOS7 ~]# a=1 [root@CentOS7 ~]# b=1 [root@CentOS7 ~]# echo $((a * b)) 1 |
割り算
a=1
b=1
echo $((a / b))
1 2 3 4 |
[root@CentOS7 ~]# a=1 [root@CentOS7 ~]# b=1 [root@CentOS7 ~]# echo $((a / b)) 1 |
剰余算
# aの数字をbの数字で割ったあまりを返す。
a=1
b=1
echo $((a % b))
1 2 3 4 |
[root@CentOS7 ~]# a=1 [root@CentOS7 ~]# b=1 [root@CentOS7 ~]# echo $((a % b)) 0 |
この剰余算、ちょっと分かりずらいので補足します。主な使い道としては、表テーブル等の行の色を1段ごとに交互に変えたい場合などに、この剰余算を使用します。2で割ったあまりが0なら偶数、1なら奇数と言った具合です。ただ割るだけでなく、その余りを対象とします。
比較演算子とは?
先程は算術演算の紹介をしましたが、演算子というのは「算術演算子」だけでなく「比較演算子」という、演算子の左右にあるデータを比較をするための演算子もあるんです。
比較演算子はどういうときに使われているのかというと、入力された文字列が正しいかを確認したいときや、「if」文や「case」文といった制御構文を組み合わせて繰り返し処理をするときに使われています。
「if」文や「case」文については、次回の記事で解説しています。
数値比較演算子
下記の一覧は、数値を比較するために必要な演算子をまとめたものです。
比較演算子 | 使用例 | 意味 |
-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が等しくなければ真 |
この比較演算子は、シェルスクリプトを作成する上で、欠かすことは出来ないモノです。比較演算子を使わないシェルスクリプトはまず無いといってよいでしょう。
下記に、最もよく使うであろう「リターンコード」の比較判定文を試してみます。なんだったらこの構文を丸ごと暗記しても良いくらいよく使います。
echo "Hello World"
if [ $? -eq 0 ]; then
echo "コマンドは、正常に実行しました。"
fi
1 2 3 4 5 6 |
[root@CentOS7 ~]# echo "Hello World" Hello World [root@CentOS7 ~]# if [ $? -eq 0 ]; then > echo "コマンドは、正常に実行しました。" > fi コマンドは、正常に実行しました。 |
「echo」コマンドで正常に文字列”Hello World”の出力が終えたため、終了ステータスコードは「真(true)」を取得しています。
つづいて文字列の比較を行ってみましょう。
シェルスクリプトで文字列を比較する為に必要なプログラムは、たった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 "違う文字列ですね"`
1 2 3 4 |
[root@CentOS7 ~]# a="文字列1" [root@CentOS7 ~]# b="文字列2" [root@CentOS7 ~]# echo `[ "$a" = "$b" ] && echo "同じ文字列ですね" || echo "違う文字列ですね"` 違う文字列ですね |
上記では、それとなく三項演算子チックに記述していますが、シェルには三項演算子は存在しません。ただし、上記の様にそれらしく振舞うことは可能です。
演算子 | 意味 |
&& | 直前に実行されたコマンドの結果が真(終了ステータスが「0」)である場合のみ、次のコマンドを実行する。 |
| | | 直前に実行されたコマンドの結果が偽(終了ステータスが「0」以外)である場合のみ、次のコマンドを実行する。 |
その他の比較演算子
下記の一覧は、ファイルやディレクトリを比較するために必要な演算子をまとめたものです。
比較演算子 | 使用例 | 意味 |
-d | -d ディレクトリ | ディレクトリであれば真 |
-f | -f ファイル | 通常のファイルであれば真 |
-L | -L シンボリックリンク | シンボリックリンクであれば真 |
-r | -r ファイル | 読み取り可能ファイルなら真 |
-w | -w ファイル | 書き込み可能ファイルなら真 |
-x | -x ファイル | 実行可能ファイルなら真 |
-s | -s ファイル | サイズが0以上のファイルなら真 |
ファイルやディレクトリの比較例については、下記のリンクページを参照ください。
Shellスクリプト基礎知識(全11記事+1)
├─シェルスクリプトの基本事項!
├─変数と特殊変数について!
├─演算子「算術演算子」「比較演算子」について!
├─条件分岐「if」「case」について!
├─ループ処理「for」「while」について!
├─文字列置換「bash」「sed」について!
├─複数行のテキスト出力!ヒアドキュメントについて!
├─書式?戻り値?シェルスクリプト内の関数について!
├─シェルの組み込みコマンドについて!
├─クォートとは?コマンド置換とは?実現方法と内容の違いについて!
└─リダイレクトとは?標準入力・出力、標準エラー出力等について!
(補足)シェルスクリプトの設計書とは?必要な項目や書き方等を解説!