Shell 可以进行整数运算,不需要调用外部命令。算术扩展使用
$(( ))语法,支持加减乘除、取余、位运算等操作。
echo $((1 + 1))
echo $((10 - 3))
echo $((4 * 5))
echo $((20 / 3))
echo $((20 % 3))
运行结果:
2
7
20
6
2
注意:Shell 只支持整数运算,除法会取整。
| 运算符 | 含义 |
|---|---|
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除(取整) |
| % | 取余 |
| ** | 幂运算 |
echo $((2 ** 10))
echo $((17 / 5))
echo $((17 % 5))
| 运算符 | 含义 |
|---|---|
| << | 左移 |
| >> | 右移 |
| & | 与 |
| | | 或 |
| ^ | 异或 |
| ~ | 取反 |
echo $((8 << 2))
echo $((16 >> 2))
echo $((5 & 3))
echo $((5 | 3))
| 运算符 | 含义 |
|---|---|
| < | 小于 |
| > | 大于 |
| <= | 小于等于 |
| >= | 大于等于 |
| == | 等于 |
| != | 不等于 |
比较结果为真返回 1,为假返回 0:
echo $((5 > 3))
echo $((5 < 3))
| 运算符 | 含义 |
|---|---|
| && | 逻辑与 |
| || | 逻辑或 |
| ! | 逻辑非 |
echo $((1 && 1))
echo $((1 || 0))
echo $((!1))
echo $((5 > 3 ? 1 : 0))
result=$((score >= 60 ? 1 : 0))
在算术扩展中,变量名不需要加 $:
a=10
b=3
echo $((a + b))
echo $((a * b))
echo $((a / b))
也可以加 $:
echo $(($a + $b))
a=10
((a = a + 1))
echo $a
((a += 5))
((a -= 3))
((a *= 2))
((a /= 3))
(( )) 语法用于执行算术运算,不需要 $ 前缀。
a=10
echo $((a++))
echo $a
echo $((++a))
echo $a
a++ 先返回后自增,++a 先自增后返回。
echo $((16#FF))
echo $((8#77))
echo $((2#1010))
输出:
255
63
10
输出其他进制:
printf "%x\n" 255
printf "%o\n" 63
arr=(10 20 30 40 50)
i=2
echo ${arr[i]}
echo ${arr[i+1]}
```bash
a=10
if ((a > 5)); then
echo "a 大于 5"
fi
if ((a % 2 == 0)); then
echo "a 是偶数"
fi
比 [ ] 更直观:
if [ $a -gt 5 ]; then
echo "a 大于 5"
fi
for ((i = 1; i <= 10; i++)); do
echo $i
done
sum=0
for ((i = 1; i <= 100; i++)); do
((sum += i))
done
echo $sum
旧方式,不推荐:
result=$(expr 1 + 1)
result=$(expr 5 \* 3)
运算符两边必须有空格,* 需要转义。
let a=1+1
let a++
let a+=5
不如 $(( )) 直观,不推荐。
Shell 不支持浮点运算,需要用 bc:
echo "scale=2; 10 / 3" | bc
echo "3.14 * 2" | bc
result=$(echo "scale=2; $a / $b" | bc)
或者用 awk:
echo | awk '{print 10/3}'
awk "BEGIN {print $a / $b}"
total=200
part=75
percent=$((part * 100 / total))
echo "$part 是 $total 的 $percent%"
n=7
if ((n % 2 == 0)); then
echo "$n 是偶数"
else
echo "$n 是奇数"
fi
count=0
for file in *.txt; do
((count++))
done
echo "找到 $count 个文件"
score=85
if ((score >= 90)); then
echo "优秀"
elif ((score >= 60)); then
echo "及格"
else
echo "不及格"
fi
$(( )) 是推荐的算术扩展语法$(( )) 用于条件判断和赋值