変数を操作する - Linux シェルスクリプト プログラミング

PROGRAM


変数を操作する

プログラムでは一般的に、変数の値をいろいろと操作することを "演算" といいます。そして、演算をどのように行うかを示した記号を "演算子" と言います。

数値演算

言葉ではなんだか難しいかもしれないですけど、たとえば 「りんごが3つ、みかんが2つ。合計いくつ?」 という問題の場合、3個と2個を足す行いが演算で、足し算ですから "+" が演算子となります。

Linux シェル (sh) で計算を行う場合には、次のような感じになります。

# 全部でいくつかを SUM に保存するとします。

 

# りんごが3つ

RINGO=3

 

# みかんが2つ

MIKAN=2

 

# 合計いくつ?

SUM=$((RINGO + MIKAN));

 

 

# 一応…、画面に計算結果を表示しておきます…。

echo "TOTAL = $SUM"

Linux シェルでは、少し表現が特殊ですけど、次の箇所が実際の演算をしている行になります。

SUM=$((RINGO + MIKAN));

RINGO と MIKAN の値を足してそれを SUMに保存するという演算です。

Linux シェル (sh) では、変数内の数値の計算をする際には、その数式を $(( )) でくくるような感じになります。その括弧の中には、計算したい変数を "$" をつけずに記載します。

そして、計算された結果を SUM 変数に "=" を使って代入します。

 

ここで、「りんごが3つありました。そこに新たに2つ、りんごを買い足しました。」 というのをプログラムで書いてみます。

# りんごが3つありました。

RINGO=3

 

# そこに新たに2つ、りんごを買い足しました。

RINGO=$((RINGO + 2)

このように、RINGO に 2 を加えた値を、再び RINGO に代入しなおすようにします。

 

これまでは、加算(足し算)を記してきましたが、ほかにもいくつか演算子が存在します。

 Linux シェル (sh) の場合、演算子は C 言語と同じものが使えるそうで、たとえば次のような演算子が用意されています。

■ 算術演算子

演算子 意味
+ $((a + 1)) $a に 1 を足し合わせた値を計算します。
- $((a - 2)) $a から 2 を引いた値を計算します。
* $((a * 3)) $a に 3 をかけあわせた値を計算します。
/ $((a / 4)) $a を 4 で割った値を計算します。
% $((a % 5)) $a を 5 で割った余りを求めます。
** $((a ** 6)) $a を 6 乗した値を計算します。

■ 代入演算子

演算子 意味
= a=1 $a に 1 を代入します。このとき、変数名と "=" との間や、"=" と値との間に空白を挟んでしまうとエラーになるようなので注意します。

これらの演算子は一度に複数利用することが出来ます。

a=$(((10 + b / 2) * 3 + c ** 2 ))

計算のされ方は、算数のときに習ったのとほぼ一緒です。括弧が優先され、累乗、乗除と計算されて、加減算…、というような流れになります。なお、剰余を求める "%" は掛け算と同じ優先度となっているようです。

 

 このほかにも、ビット演算というものも存在します。

ビットというのは、パソコンでの値の最小単位で、ON か OFF かを示します。数字の場合はこれを 1 か 0 かで表現して、パソコンではこれを組み合わせて行くことで、大きい数値を表して行きます。

たとえば "0" なら 0 を、"1" なら 1 を、そして "10" なら 2 を、"11" なら 3 を、"100" なら 4 を、"101" なら 5 を、といった具合に、表現します。ここで引用符で括って表現したような 0 か 1 かで構成された数値のことを "二進数" といいます。

パソコン上では数値を必ず、この 2 進数に変換することができます。

そしてこの 2 進数の 0 か 1 かの各桁のことを "ビット" と言って、この "ビット" を操作する演算のことを "ビット演算" または "論理演算" と呼びます。

 

シェルスクリプト (sh) では、次のようなビット演算が用意されています。

■ ビット演算子 (論理演算)

演算子 意味
& $((a & 1)) $a と 1 との論理積 AND を取得します。論理積とは、2 つの値を二進数の各桁毎で比較して、両方が 1 の場合にのみ、その桁を 1 にします。
| $((a | 2)) $a と 2 との論理和 OR を取得します。論理和とは、2 つの値を二進数の各桁毎で比較して、どちらかひとつでも 1 である場合には、その桁を 1 にします。
^ $((a ^ 2)) $a と 2 との排他的論理和 XOR を取得します。排他的論理和とは、2 つの値を二進数の各桁毎で比較して、どちらか一方だけが 1 である場合に、その桁を 1 にします。
~ $((~a)) $a の否定 NOT を取得します。否定とは、その値を構成する全ビットの 1 と 0 とを入れ替えます。数値がたとえば 32 ビットで表現される場合には、その 32 個のビット全てで 1 と 0 とを入れ替えます。

これらは、2つの数値をそれぞれを二進数と見立てて、それぞれの桁 (ビット) 同士に論理演算を行うというものです。

このほかにももう少し、ビット関連の演算があります。

 

■ ビット演算子 (シフト演算)

演算子 意味
<< $((a << 1)) $a のビットを左へ 1 つずらした値を取得します。あふれた部分はカットされ、右側は 0 で埋められます。
>> $((a >> 2)) $a のビットを右へ 2 つずらした値を取得します。入りきらなくなった部分はカットされ、左側は 0 で埋められます。

シフト演算というのは、数値を 2 進数と見立てて、その数値の桁を右や左へずらす演算のことを言います。

たとえば、日常で使用している数値は 10 進数で、この 10 進数は 10 倍するごとに桁が左に動きます。これと同じように、2 進数で見て桁を左に動かせば、その数値は全体として 2 倍されることになります。同様に、逆に動かせば 1/2 です。

文字列演算

他のプログラム言語にあるような文字列演算とは少し違いますけど、文字列を連結したい場合には、次のようにします。

STR3="$STR1$STR2"

上では STR3 に代入する文字列として "$STR1$STR2" を指定していますが、これは、左辺が参照された際に、$STR1 と $STR2 のそれぞれが、その変数に代入されている文字列に置き換えられます。

変数名のつなぎ目をはっきりさせたい場合には、STR3="${STR1}${STR2}" としても大丈夫です。


[ もどる ]