Loose-Info.com
Last Update 2022/08/29
TOP - 各種テスト - bash - 算術式評価

算術式評価


テスト項目

(01) ++ --

(02) - (単項マイナス)

(03) ! ~ (論理的否定、ビット単位の否定)

(04) ** (べき乗)

(05) * / % (乗算、除算、剰余)

(06) + - (加算、減算)

(07) << >> (左ビットシフト、右ビットシフト)

(08) <= >= < > (比較演算子)

(09) == != (等価・不等価演算子)

(10) & ^ | (ビットごとのAND、XOR、OR)

(11) && || (論理積、論理和)

(12)  式  ?  式  :  式  (三項演算子)

(13) = *= /= %= += -= <<= >>= &= ^= |= (各種代入)

(14)  式  ,  式  (コンマ演算子)


(01) ++ --


サンプルコード
sample.sh
#!/bin/bash echo "変数のポストインクリメント" echo "n = $(( n=10 ))" echo "\$(( n++ )) : $(( n++ ))" echo "n = $n" echo echo "変数のポストデクリメント" echo "n = $(( n=10 ))" echo "\$(( n-- )) : $(( n-- ))" echo "n = $n" echo echo "変数のプリインクリメント" echo "n = $(( n=10 ))" echo "\$(( ++n )) : $(( ++n ))" echo "n = $n" echo echo "変数のプリデクリメント" echo "n = $(( n=10 ))" echo "\$(( --n )) : $(( --n ))" echo "n = $n" echo

実行結果
$ ./sample.sh 変数のポストインクリメント n = 10 $(( n++ )) : 10 n = 11 <--- 演算評価後に加算 変数のポストデクリメント n = 10 $(( n-- )) : 10 n = 9 <--- 演算評価後に減算 変数のプリインクリメント n = 10 $(( ++n )) : 11 <--- 演算評価前に加算 n = 11 変数のプリデクリメント n = 10 $(( --n )) : 9 <--- 演算評価前に減算 n = 9

(02) - (単項マイナス)


サンプルコード
sample.sh
#!/bin/bash echo "単項マイナス" echo "n = $(( n=10 ))" echo "\$(( -n )) : $(( -n ))" echo echo "n = $(( n=-10 ))" echo "\$(( -n )) : $(( -n ))" echo

実行結果
$ ./sample.sh 単項マイナス n = 10 $(( -n )) : -10 <--- 正負反転 n = -10 $(( -n )) : 10 <--- 正負反転

(03) ! ~


サンプルコード
sample.sh
#!/bin/bash echo "論理的否定" echo "\$(( ! 1 )) : $(( ! 1 ))" echo echo "\$(( ! 0 )) : $(( ! 0 ))" echo echo "ビット単位否定" echo "\$(( ~ 1 )) : $(( ~ 1 ))" echo echo "\$(( ~ 0 )) : $(( ~ 0 ))" echo

実行結果
$ ./sample.sh 論理的否定 $(( ! 1 )) : 0 <--- 真式に対する否定 : 偽 $(( ! 0 )) : 1 <--- 偽式に対する否定 : 真 ビット単位否定 $(( ~ 1 )) : -2 <--- 各ビット反転で最下位ビット以外全て1となる $(( ~ 0 )) : -1 <--- 各ビット反転で全ビット1となる

(04) **


サンプルコード
sample.sh
#!/bin/bash echo "べき乗" echo "\$(( 2**2 )) : $(( 2**2 ))" echo echo "\$(( 3**2 )) : $(( 3**2 ))" echo echo "\$(( 3**3 )) : $(( 3**3 ))" echo

実行結果
$ ./sample.sh べき乗 $(( 2**2 )) : 4 <--- 2 × 2 $(( 3**2 )) : 9 <--- 3 × 3 $(( 3**3 )) : 27 <--- 3 × 3 × 3

(05) * / %


サンプルコード
sample.sh
#!/bin/bash echo "乗算" echo "\$(( 8 * 3 )) : $(( 8 * 3 ))" echo echo "除算" echo "\$(( 8 / 3 )) : $(( 8 / 3 ))" echo echo "剰余" echo "\$(( 8 % 3 )) : $(( 8 % 3 ))" echo

実行結果
$ ./sample.sh 乗算 $(( 8 * 3 )) : 24 <--- 8 × 3 除算 $(( 8 / 3 )) : 2 <--- 8 ÷ 3 剰余 $(( 8 % 3 )) : 2 <--- 8 ÷ 3 の余り

(06) + -


サンプルコード
sample.sh
#!/bin/bash echo "加算" echo "\$(( 4 + 3 )) : $(( 4 + 3 ))" echo echo "減算" echo "\$(( 4 - 3 )) : $(( 4 - 3 ))" echo

実行結果
$ ./sample.sh 加算 $(( 4 + 3 )) : 7 減算 $(( 4 - 3 )) : 1

(07) << >>


サンプルコード
sample.sh
#!/bin/bash echo "左ビットシフト" echo "\$(( 1 << 2 )) : $(( 1 << 2 ))" echo echo "右ビットシフト" echo "\$(( 4 >> 2 )) : $(( 4 >> 2 ))" echo

実行結果
$ ./sample.sh 左ビットシフト $(( 1 << 2 )) : 4 0001 ---> 0100 右ビットシフト $(( 4 >> 2 )) : 1 0100 ---> 0001

(08) <= >= < >


サンプルコード
sample.sh
#!/bin/bash echo "比較演算子 <=" echo "\$(( 1 <= 2 )) : $(( 1 <= 2 ))" echo "\$(( 2 <= 1 )) : $(( 2 <= 1 ))" echo "\$(( 2 <= 2 )) : $(( 2 <= 2 ))" echo echo "比較演算子 >=" echo "\$(( 1 >= 2 )) : $(( 1 >= 2 ))" echo "\$(( 2 >= 1 )) : $(( 2 >= 1 ))" echo "\$(( 2 >= 2 )) : $(( 2 >= 2 ))" echo echo "比較演算子 <" echo "\$(( 1 < 2 )) : $(( 1 < 2 ))" echo "\$(( 2 < 1 )) : $(( 2 < 1 ))" echo "\$(( 2 < 2 )) : $(( 2 < 2 ))" echo echo "比較演算子 >" echo "\$(( 1 > 2 )) : $(( 1 > 2 ))" echo "\$(( 2 > 1 )) : $(( 2 > 1 ))" echo "\$(( 2 > 2 )) : $(( 2 > 2 ))" echo

実行結果
$ ./sample.sh 比較演算子 <= $(( 1 <= 2 )) : 1 $(( 2 <= 1 )) : 0 $(( 2 <= 2 )) : 1 比較演算子 >= $(( 1 >= 2 )) : 0 $(( 2 >= 1 )) : 1 $(( 2 >= 2 )) : 1 比較演算子 < $(( 1 < 2 )) : 1 $(( 2 < 1 )) : 0 $(( 2 < 2 )) : 0 比較演算子 > $(( 1 > 2 )) : 0 $(( 2 > 1 )) : 1 $(( 2 > 2 )) : 0

(09) == !=


サンプルコード
sample.sh
#!/bin/bash echo "等価演算子 ==" echo "\$(( 1 == 2 )) : $(( 1 == 2 ))" echo "\$(( 2 == 2 )) : $(( 2 == 2 ))" echo echo "比較演算子 !=" echo "\$(( 1 != 2 )) : $(( 1 != 2 ))" echo "\$(( 2 != 2 )) : $(( 2 != 2 ))" echo

実行結果
$ ./sample.sh 等価演算子 == $(( 1 == 2 )) : 0 $(( 2 == 2 )) : 1 比較演算子 != $(( 1 != 2 )) : 1 $(( 2 != 2 )) : 0

(10) & ^ |


サンプルコード
sample.sh
#!/bin/bash echo "ビットごとのAND &" echo "\$(( 31 & 1 )) : $(( 31 & 1 ))" echo "\$(( 31 & 65 )) : $(( 31 & 65 ))" echo echo "ビットごとのXOR ^" echo "\$(( 31 ^ 1 )) : $(( 31 ^ 1 ))" echo "\$(( 31 ^ 65 )) : $(( 31 ^ 65 ))" echo echo "ビットごとのOR |" echo "\$(( 31 | 1 )) : $(( 31 | 1 ))" echo "\$(( 31 | 65 )) : $(( 31 | 65 ))" echo

実行結果
$ ./sample.sh ビットごとのAND & $(( 31 & 1 )) : 1 <---0011111 & 0000001 = 0000001 $(( 31 & 65 )) : 1 <---0011111 & 1000001 = 0000001 ビットごとのXOR ^ $(( 31 ^ 1 )) : 30 <---0011111 ^ 0000001 = 0011110 $(( 31 ^ 65 )) : 94 <---0011111 ^ 1000001 = 1011110 ビットごとのOR ^ $(( 31 | 1 )) : 31 <---0011111 | 0000001 = 0011111 $(( 31 | 65 )) : 95 <---0011111 | 1000001 = 1011111

(11) && ||


サンプルコード
sample.sh
#!/bin/bash echo "論理積 &&" echo "\$(( 0 && 0 )) : $(( 0 && 0 ))" echo "\$(( 1 && 0 )) : $(( 1 && 0 ))" echo "\$(( 1 && 1 )) : $(( 1 && 1 ))" echo echo "論理和 ||" echo "\$(( 0 || 0 )) : $(( 0 || 0 ))" echo "\$(( 1 || 0 )) : $(( 1 || 0 ))" echo "\$(( 1 || 1 )) : $(( 1 || 1 ))" echo

実行結果
$ ./sample.sh 論理積 && $(( 0 && 0 )) : 0 $(( 1 && 0 )) : 0 $(( 1 && 1 )) : 1 論理和 || $(( 0 || 0 )) : 0 $(( 1 || 0 )) : 1 $(( 1 || 1 )) : 1

(12)  式  ?  式  :  式 


サンプルコード
sample.sh
#!/bin/bash n=0 echo "三項演算子" echo "\$(( n == 0 ? 10 : 20 )) : $(( n == 0 ? 10 : 20 ))" echo "\$(( n == 1 ? 10 : 20 )) : $(( n == 1 ? 10 : 20 ))" echo

実行結果
$ ./sample.sh 三項演算子 $(( n == 0 ? 10 : 20 )) : 10 <--- 比較演算が真となるため10を返す $(( n == 1 ? 10 : 20 )) : 20 <--- 比較演算が偽となるため20を返す

(13) = *= /= %= += -= <<= >>= &= ^= |=


サンプルコード
sample.sh
#!/bin/bash echo "代入演算子 =" echo "\$(( n = 10 )) : $(( n = 10 ))" echo "n = $n" echo echo "代入演算子 *=" echo "\$(( n *= 10 )) : $(( n *= 10 ))" echo "n = $n" echo echo "代入演算子 /=" echo "\$(( n /= 8 )) : $(( n /= 8 ))" echo "n = $n" echo echo "代入演算子 %=" echo "\$(( n %= 7 )) : $(( n %= 7 ))" echo "n = $n" echo echo "代入演算子 +=" echo "\$(( n += 15 )) : $(( n += 15 ))" echo "n = $n" echo echo "代入演算子 -=" echo "\$(( n -= 4 )) : $(( n -= 4 ))" echo "n = $n" echo echo "代入演算子 <<=" echo "\$(( n <<= 2 )) : $(( n <<= 2 ))" echo "n = $n" echo echo "代入演算子 <<=" echo "\$(( n >>= 3 )) : $(( n >>= 3 ))" echo "n = $n" echo echo "代入演算子 &=" echo "\$(( n &= 15 )) : $(( n &= 15 ))" echo "n = $n" echo echo "代入演算子 |=" echo "\$(( n |= 7 )) : $(( n |= 7 ))" echo "n = $n" echo

実行結果
$ ./sample.sh 代入演算子 = $(( n = 10 )) : 10 <--- 単純な代入 n = 10 代入演算子 *= $(( n *= 10 )) : 100 <--- n = 10 × 10 n = 100 代入演算子 /= $(( n /= 8 )) : 12 <--- n = 100 / 8 n = 12 代入演算子 %= $(( n %= 7 )) : 5 <--- n = 12 % 7 (余り 5) n = 5 代入演算子 += $(( n += 15 )) : 20 <--- n = 5 + 15 n = 20 代入演算子 -= $(( n -= 4 )) : 16 <--- n = 20 - 4 n = 16 代入演算子 <<= $(( n <<= 2 )) : 64 <--- n = 01000 << 2 n = 64 代入演算子 <<= $(( n >>= 3 )) : 8 <--- n = 0100000 >> 3 n = 8 代入演算子 &= $(( n &= 15 )) : 8 <--- n = 01000 & 01111 n = 8 代入演算子 |= $(( n |= 7 )) : 15 <--- n = 01000 | 00111 n = 15

(14)  式  ,  式 


サンプルコード
sample.sh
#!/bin/bash echo "コンマ演算子" echo "\$(( n=1 , ++n )) : $(( n=1 , ++n ))" echo "\$(( n=1 , ++n , n*=2 )) : $(( n=1 , ++n , n*=2))" echo

実行結果
$ ./sample.sh コンマ演算子 $(( n=1 , ++n )) : 2 <--- コンマの左側から右側へ評価され、返される値は++nの値 $(( n=1 , ++n , n*=2 )) : 4 <--- コンマの左側から右側へ順次評価され、返される値はn*=2の値

実行環境

GNU bash, version 5.1.16
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。