Last Update 2022/08/29
算術式評価
テスト項目
(01) ++ --
(02) - (単項マイナス)
(03) ! ~ (論理的否定、ビット単位の否定)
(04) ** (べき乗)
(05) * / % (乗算、除算、剰余)
(06) + - (加算、減算)
(08) <= >= < > (比較演算子)
(09) == != (等価・不等価演算子)
(11) && || (論理積、論理和)
(12) 式 ? 式 : 式 (三項演算子)
(14) 式 , 式 (コンマ演算子)
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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 <--- 正負反転
サンプルコード
sample.sh
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となる
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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 の余り
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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を返す
サンプルコード
sample.sh
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
サンプルコード
sample.sh
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
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。