演算子とは「+」や「-」と言った計算時に使われるものだ。また比較にも使われる。
プログラミングではどの言語にもある機能で、シェルスクリプトにももちろん存在する。
このページではシェルスクリプトでの演算子の使い方を見ていこう。
目次
演算子とは?
演算子ときいてもピンとこないかもしれない。「1+1=2」としたとき「+」や「=」が演算子にあたる。重要な存在だ。
これらは分岐と繰り返しの条件式を立てるときに使用される。演算子を知らなければ式がたてられないので、辛抱して頭にいれていってほしい。
bashには多くの演算子があるが少々癖がある。四則演算をはじめ、状態を確かめる演算子や比較を行う演算子などが用意されている。
シェルスクリプトの四則演算
四則演算の基本
どのプログラミング言語でも似たようなものだが、シェルスクリプトには次の様な四足演算子が用意されている。
算術演算子 | 意味 |
a + b | aとbの和を計算する |
a - b | aとbの差を計算する |
a * b 環境によっては a \* b のように*をエスケープする |
aとbの積を計算する |
a / b |
aとbの商を計算する |
a % b |
aでbで割ったときの余りを計算する |
例えば、以下のようにすると四則演算が出来る。これはbashの場合だ。
$ echo $(( 5 + 5))
$ echo $(( 5 - 5))
$ echo $(( 5 * 5))
$ echo $(( 5 / 5))
$ echo $(( 5 % 5))
スクリプトで書いてみる
vi calculating.sh
では実際にスクリプトで書いて実行してみる。
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/bash #変数設定 VAR_LEFT=5 VAR_RIGHT=5 #計算させてみる echo $(($VAR_LEFT + $VAR_RIGHT)) echo $(($VAR_LEFT - $VAR_RIGHT)) echo $(($VAR_LEFT * $VAR_RIGHT)) echo $(($VAR_LEFT / $VAR_RIGHT)) echo $(($VAR_LEFT % $VAR_RIGHT)) |
exprコマンド
ほかに「exprコマンド」を使うという方法もある。シェルスクリプト特有のものではなく、単体のコマンドとして存在するものだ。
次のように記述する。
$ echo `expr 1 + 1`
このとき「`」(バッククオート)でかこむことに注意しよう。「`」でかこむことで実行結果が代入される。囲まなかった場合式自体が文字列として代入されてしまう。またスペースを入れる位置を間違えるとキチンと動作しないので、気をつけよう。
また、実行速度が遅いという欠点があるため、bashが走る環境ならば二重括弧を使う方がいいだろう。
数値比較の演算子
四則演算だけではなく演算子は他にもある。ここから先は計算に使うのではなく、条件式と呼ばれるものになる。「もし〇〇なら、××する」というときの○○の部分を作るための式だ。
数値比較の演算子からご紹介していこう。
数値比較の演算子 |
意味 |
数値1 -eq 数値2 |
数値1と数値2が等しければ真 |
数値1 -ge 数値2 |
数値1が数値2より大きい、もしくは等しければ真 |
数値1 -gt 数値2 |
数値1が数値2より大きければ真 |
数値1 -le 数値2 |
数値1が数値2より小さい、もしくは等しければ真 |
数値1 -lt 数値2 |
数値1が数値2未満であれば真 |
数値1 -ne 数値2 |
数値1と数値2が等しくなければ真 |
一目見ると覚えにくいが、次のようになっている。英語にするとわかりやすいだろう。
- eq:equal to
- ge:greater than or equal to
- gt:greater than
- le:less than or equal to
- lt:less than
- ne:not equal to
文字列の比較
続いては文字列のテストだ。他の文字列評価演算子と共にご紹介しておこう。
文字列比較の演算子 |
意味 |
文字列 |
文字列の長さが0より大きければ真 |
-n 文字列 |
文字列の長さが0より大きければ真 |
!文字列 |
文字列の長さが0であれば真 |
-z 文字列 |
文字列の長さが0であれば真 |
文字列1 = 文字列2 |
2つの文字列が等しければ真 |
文字列1 != 文字列2 |
2つの文字列が等しくなければ真 |
こちらはまだわかりやすいだろう。
ファイルチェック
シェルスクリプト特有だが、ファイルの形式やパーミションをチェックするときに下記の様な演算子が使える。覚えやすいとは思うが、咄嗟に出てこないと思うので、都度調べるのがいいだろう。
ファイルチェック演算子 |
意味 |
-d ファイル名 |
ディレクトリなら真 |
-f ファイル名 |
通常ファイルなら真 |
-L ファイル名 |
シンボリックリンクなら真 |
-r ファイル名 |
読み取り可能ファイルなら真 |
-w ファイル名 |
書き込み可能ファイルなら真 |
-x ファイル名 |
実行可能ファイルなら真 |
-s ファイル名 |
サイズが0より大きければ真 |
ファイル1 -nt ファイル2 |
ファイル1がファイル2より新しければ真 |
ファイル1 -ot ファイル2 |
ファイル1がファイル2より古ければ真 |
OS上でそのまま動くスクリプトならではの演算子だ。ファイルやディレクトリ操作時に使える便利な演算子たちだろう。
条件式の論理結合
条件式を組み合わせるときは次のようになる。
条件式の論理結合 |
意味 |
! 条件 |
条件式が偽であれば真 |
条件1 -a 条件2 |
両方の条件式が真であれば真(and) |
条件1 -o 条件2 |
いずれかの条件式が真であれば真(or) |
こちらも演算子的ではないのでプログラミング経験者の方は違和感があるだろう。シェルスクリプト特有だと思って、慣れるしかない。
演算子を使って条件式を立ててみる
ifやwhileといった条件式を使う場面についてはまたご紹介するが、一旦上記の条件式を使った例を見ておこう。
vi ex1.sh
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/bash #変数宣言 VAR_1=1 VAR_2=1 #if制御文 #条件を満たすならYesそれ以外はNoと出力 #[]の中が条件式 if [ $VAR_1 -eq $VAR_2 ]; then echo “Yes” else echo ”No” fi |
if [ ] の中に入っているものが条件式だ。条件が「真=正しければ」Yesと表示、正しくなければNoの表示になる。
色々な条件で実験してみてほしい。
まとめ
このページではシェルスクリプトの演算子についてお伝えした。
使い方は簡単だが、覚えにくいものも多い。シェルスクリプトを書く際には必ず使うので、マスターしておいてほしい。
この記事に限らず誤字脱字が多すぎる
「数値比較の演算子」の欄に至っては文法がまず破綻してる
毎日楽しく書くのはいいけどしっかり推敲したほうがいい
このレベルの人間が講師だと研修にも期待できない
ご指摘ありがとうございます。おっしゃる通りですね。日々どんどんとアップしていましたので、一通りの修正をかけていきます。
演算子を使って条件式を立ててみる
のサンプル
×VAR_2
○$VAR_2
上の方に同意。
ご指摘いただきありがとうございます。
if条件式内のVAR_2を$VAR_2に訂正いたしました。
引き続き、ご愛読のほど、よろしくお願いいたします。
exprコマンドで'バッククオートでかこむこと'とありますが、
''の記号で囲むということでしょうか?
上記の説明にあるように、'expr ~'の式の後に実行結果の桁数分
だけ空白を''で囲んで記述すればよいということでしょうか?
例)実行結果が3桁の場合
$ echo
expr 100 + 1
※''内は3桁分の空白
先程の質問について記載がおかしかったので再送します。
exprコマンドで'バッククオートでかこむこと'とありますが、
バッククオートの記号とはどのような記号でしょうか?
また記述する際は上記の説明にあるように、'expr ~'の式の後
に実行結果の桁数分だけ空白をバッククオートの記号で囲んで記述
すればよいということでしょうか?
例)実行結果が3桁の場合
$ echo
expr 100 + 1
バッククオートの記号 バッククオートの記号
※バッククオートの記号内は3桁分の空白
いつもご愛読いただきありがとうございます。
確認致しましたところ、記事中のバッククオート記号が正しく表示されておりませんでした。現在は修正されておりますので、お手数ですが再度御覧下さい。
バッククオートの入力方法ですが、一般的な日本語キーボードでしたら【SHIFTキー+@キー】の組み合わせとなります。
バッククオートはシングルクオート【SHIFT+数字の7キー】とよく似ていますが、それぞれに動作が全く異なりますのでご注意ください。