Linux let命令是bash shell的内置命令,用于执行整数算术运算。
提示: let命令是bash内置命令,因此比外部命令expr执行速度更快,但只能用于bash shell环境。
语法格式
let 表达式 [表达式 ...]
算术操作符
| 操作符 |
说明 |
示例 |
+ |
加法 |
let "a = 5 + 3" |
- |
减法 |
let "a = 10 - 4" |
* |
乘法 |
let "a = 6 * 7" |
/ |
整数除法 |
let "a = 20 / 4" |
% |
取模(求余) |
let "a = 17 % 5" |
** |
幂运算 |
let "a = 2 ** 3" |
++ |
自增 |
let "a++" |
-- |
自减 |
let "a--" |
& |
位与 |
let "a = 5 & 3" |
| |
位或 |
let "a = 5 | 3" |
^ |
位异或 |
let "a = 5 ^ 3" |
<< |
左移位 |
let "a = 5 << 2" |
>> |
右移位 |
let "a = 20 >> 2" |
~ |
位取反 |
let "a = ~5" |
! |
逻辑非 |
let "a = !0" |
&& |
逻辑与 |
let "a = 1 && 1" |
|| |
逻辑或 |
let "a = 0 || 1" |
<=, >=, <, >, ==, != |
关系运算符 |
let "a = 5 > 3" |
=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= |
赋值运算符 |
let "a += 5" |
使用示例
示例1:基本算术运算
# 加法
let "result = 5 + 3"
echo $result # 输出:8
# 乘法
let "result = 6 * 7"
echo $result # 输出:42
# 幂运算
let "result = 2 ** 3"
echo $result # 输出:8
# 复合表达式
let "result = (5 + 3) * 2"
echo $result # 输出:16
示例2:自增自减运算
# 自增运算
count=5
let "count++"
echo $count # 输出:6
# 自减运算
let "count--"
echo $count # 输出:5
# 前缀自增
count=5
let "++count"
echo $count # 输出:6
# 多个自增
let "count += 3"
echo $count # 输出:9
示例3:位运算
# 位与运算
let "result = 5 & 3" # 二进制:101 & 011 = 001
echo $result # 输出:1
# 位或运算
let "result = 5 | 3" # 二进制:101 | 011 = 111
echo $result # 输出:7
# 位异或运算
let "result = 5 ^ 3" # 二进制:101 ^ 011 = 110
echo $result # 输出:6
# 位移运算
let "result = 5 << 2" # 二进制:101 << 2 = 10100
echo $result # 输出:20
let "result = 20 >> 2" # 二进制:10100 >> 2 = 101
echo $result # 输出:5
示例4:逻辑运算
# 逻辑与
let "result = 1 && 1"
echo $result # 输出:1
let "result = 1 && 0"
echo $result # 输出:0
# 逻辑或
let "result = 0 || 1"
echo $result # 输出:1
let "result = 0 || 0"
echo $result # 输出:0
# 逻辑非
let "result = !0"
echo $result # 输出:1
let "result = !1"
echo $result # 输出:0
示例5:关系运算
# 大于比较
let "result = 5 > 3"
echo $result # 输出:1(真)
# 小于比较
let "result = 5 < 3"
echo $result # 输出:0(假)
# 等于比较
let "result = 5 == 5"
echo $result # 输出:1
# 不等于比较
let "result = 5 != 5"
echo $result # 输出:0
# 组合比较
let "result = 5 > 3 && 2 < 4"
echo $result # 输出:1
示例6:在Shell脚本中使用
#!/bin/bash
# 计算阶乘
factorial=1
for ((i=1; i<=5; i++)); do
let "factorial *= i"
done
echo "5的阶乘是: $factorial" # 输出:120
# 计算斐波那契数列
a=0
b=1
echo "斐波那契数列前10项:"
for ((i=0; i<10; i++)); do
echo -n "$a "
let "c = a + b"
a=$b
b=$c
done
echo
# 判断奇偶数
num=7
let "is_even = num % 2 == 0"
if [ $is_even -eq 1 ]; then
echo "$num 是偶数"
else
echo "$num 是奇数"
fi
示例7:实际应用场景
# 批量重命名文件
counter=1
for file in *.jpg; do
let "counter++"
mv "$file" "image$counter.jpg"
done
# 计算目录大小(近似值)
total_size=0
for size in $(ls -l | awk '{print $5}'); do
let "total_size += size"
done
echo "目录总大小: $total_size 字节"
# 生成随机数(0-99)
let "random = RANDOM % 100"
echo "随机数: $random"
# 时间计算(秒转分钟)
seconds=125
let "minutes = seconds / 60"
let "remaining_seconds = seconds % 60"
echo "$seconds 秒 = $minutes 分钟 $remaining_seconds 秒"
示例8:多个表达式
# 一次执行多个表达式
let "a = 5" "b = 10" "c = a + b"
echo "a=$a, b=$b, c=$c" # 输出:a=5, b=10, c=15
# 链式赋值
let "x = y = z = 100"
echo "x=$x, y=$y, z=$z" # 输出:x=100, y=100, z=100
# 复杂表达式组合
let "a = 10" "b = 3" "c = a % b" "d = a / b"
echo "商: $d, 余数: $c" # 输出:商: 3, 余数: 1
注意:
- let命令是bash内置命令,在非bash shell中可能不可用
- let命令只支持整数运算,不支持浮点数
- 表达式中的变量不需要使用$前缀(除非引用其他变量)
- 如果表达式的值为0,let命令返回1(假);非0则返回0(真)
- 可以使用双引号或不用引号,但如果表达式包含空格或特殊字符,建议使用双引号
- let命令的退出状态码:如果最后一个表达式的值非0,则返回0(成功);如果为0,则返回1(失败)
- 幂运算(**)在bash 2.02版本及以后才支持
let与其他算术运算方式对比
| 方式 |
语法 |
特点 |
示例 |
let |
let "a = 5 + 3" |
bash内置,支持所有运算符 |
let "result = a + b" |
$(( )) |
result=$((5 + 3)) |
bash内置,现代推荐方式 |
result=$((a + b)) |
$[ ] |
result=$[5 + 3] |
bash内置,已过时 |
result=$[a + b] |
expr |
result=$(expr 5 + 3) |
外部命令,可移植性好 |
result=$(expr $a + $b) |
bc |
echo "5+3" | bc |
外部命令,支持浮点数 |
echo "$a+$b" | bc |
awk |
awk 'BEGIN{print 5+3}' |
外部命令,支持复杂计算 |
awk -v a=5 -v b=3 'BEGIN{print a+b}' |
性能优化技巧
- 对于简单算术运算,使用
let或$(( ))比外部命令expr更快
- 在循环中避免重复调用外部命令,使用内置算术运算
- 将多个算术运算合并到一个let命令中
- 对于复杂的数学运算,考虑使用
bc或awk
- 使用位运算替代部分算术运算可以提高性能
- 避免在算术运算中频繁创建和销毁子shell
相关命令
expr - 表达式求值命令(外部命令)
bc - 任意精度计算器,支持浮点数
awk - 文本处理工具,支持数学运算
declare - 声明变量,支持整数属性
test - 条件测试命令
[ ] - test命令的别名