算术运算符

在Linux Shell中,算术运算符包括:+(加运算)、-(减运算)、(乘运算)、/(除运算)、%(取余运算)、*(幂运算),这些算术运算符的举例及其结果如下表所示:


运算符

举例

结果

+(加运算)

3+5

8

-(减运算)

5-3

2

*(乘运算)

5*3

15

/(除运算)

8/3

2

%(取余运算)

15%4

3

**(幂运算)

5**3

125

四种语法对比总览

语法名称作用示例
${var}变量引用引用变量的值echo ${name}
$(command)命令替换执行命令并返回结果echo $(date)
$[expression]算术运算(旧)整数计算echo $[1+2]
$((expression))算术运算(标准)整数计算(推荐)echo $((1+2))

1. ${var} – 变量引用

# 引用变量的值
name="John"
echo ${name}
# 输出:John

# 可以省略大括号(但有时必须用)
echo $name
# 输出:John

# 必须用大括号的场景
echo ${name}_suffix
# 输出:John_suffix
echo $name_suffix  # 错误!会找 name_suffix 这个变量

2. $(command) – 命令替换

# 执行命令,把输出作为值
echo $(date)
# 输出:2026年 03月 02日 星期一 15:30:00 CST

# 旧语法(不推荐)
echo `date`
# 输出:同上




3. $[expression] – 算术运算(旧语法)

# 整数算术运算(已被 $(( )) 取代)
echo $[1+2]
# 输出:3

num=5
echo $[num*2]  # 变量前的 $ 可以省略
# 输出:10

4. $((expression)) – 算术运算(标准语法)

# 推荐使用的算术运算
echo $((1+2))
# 输出:3

num=5
echo $((num*2))  # 变量前的 $ 可以省略
# 输出:10

# 复杂运算
echo $((2+3**2-1001%5))
# 输出:2+9-1 = 10

一句话总结

语法记法用途
${var}花括号取变量值
$(cmd)圆括号+美元执行命令
$[expr]方括号算术运算(旧)
$((expr))双圆括号算术运算(标准)

Shell内置命令——let

let 命令详解

let 是 Bash 的内置算术运算命令,功能类似 $(( )),但语法稍有不同。我来帮你整理清楚:


📊 let 命令要点

特性说明示例
作用整数算术运算let a=1+2
变量赋值直接修改变量let num+=5
空格问题不能有空格!let num=1+2 ✅
引号解决用引号包起来let "num = 1 + 2" ✅

🔍 基本用法

1. 最简单的算术运算

num2=1
echo $num2
# 输出:1

let num2=4+1
echo $num2
# 输出:5

let num2=$num2+1
echo $num2
# 输出:6

2. 赋值符号和运算符两边不能有空格!

# ❌ 错误
let num2 = 4 + 1
# bash: let: =: 语法错误

# ✅ 正确(无空格)
let num2=4+1

# ✅ 正确(用引号包起来)
let "num2 = 4 + 1"

🎯 let 的便捷写法

num=5

# 自增
let num+=2
echo $num
# 输出:7

# 自减
let num-=3
echo $num
# 输出:4

# 乘法
let num*=3
echo $num
# 输出:12

# 除法
let num/=2
echo $num
# 输出:6

📝 expr 命令详解

expr 是一个通用的表达式计算命令,能处理算术、比较、字符串和逻辑运算。但它有个特点:所有操作数和运算符之间必须有空格,而且有些符号需要转义


📊 expr 命令特点

特性说明示例
空格分隔每个部分都要空格expr 2 + 3
乘法转义* 要用 \*expr 5 \* 3
括号转义() 要用 \( \)expr \( 2 + 3 \) \* 4
返回值计算结果输出到屏幕expr 1 + 2 → 输出 3

🔍 基本算术运算

1. 加减乘除取余

# 加法
expr 5 + 3
# 输出:8

# 减法
expr 5 - 3
# 输出:2

# 乘法(注意转义)
expr 5 \* 3
# 输出:15

# 除法
expr 10 / 3
# 输出:3(整数除法)

# 取余
expr 10 % 3
# 输出:1

2. 复杂表达式

# 2 + 5 * 2 - 3 % 2
expr 2 + 5 \* 2 - 3 % 2
# 计算过程:2 + 10 - 1 = 11
# 输出:11

3. 带括号的表达式(必须转义)

# (2 + 5) * 2 - 3
expr \( 2 + 5 \) \* 2 - 3
# 计算过程:(7) * 2 - 3 = 14 - 3 = 11
# 输出:11

🎯 字符串运算

1. 计算字符串长度

expr length "Hello World"
# 输出:11

2. 提取子串

# substr 字符串 起始位置 长度(位置从1开始)
expr substr "Hello World" 7 5
# 输出:World

3. 查找字符位置

# index 字符串 字符集
expr index "Hello World" "o"
# 输出:5(第一个 o 在第5位)

expr index "Hello World" "xyz"
# 输出:0(没找到)

📝 比较运算

1. 数字比较

# 相等
expr 5 = 5
# 输出:1(真)
expr 5 = 3
# 输出:0(假)

# 不等
expr 5 != 3
# 输出:1

# 大于
expr 5 \> 3
# 输出:1

# 小于等于(需要组合)
expr 5 \< 3
# 输出:0

2. 字符串比较

# 比较字符串(按字典序)
expr "abc" \< "def"
# 输出:1

expr "abc" = "abc"
# 输出:1

💡 逻辑运算

# 与运算
expr 5 \> 3 \& 4 \< 6
# 输出:1

# 或运算
expr 5 \> 3 \| 4 \> 6
# 输出:1

⚠️ 重要注意事项

1. 空格必须

# ❌ 错误
expr 5+3

# ✅ 正确
expr 5 + 3

2. 转义特殊字符

expr 5 * 3     # ❌ 错误,* 被 shell 展开
expr 5 \* 3    # ✅ 正确
expr (2+3)     # ❌ 错误,括号被 shell 解释
expr \( 2 + 3 \)  # ✅ 正确

3. 返回值处理

# expr 的结果直接输出
result=$(expr 5 + 3)
echo $result
# 输出:8

# 判断比较结果
if expr 5 \> 3 > /dev/null; then
    echo "5 大于 3"
fi

📊 expr vs let vs $(( )) 对比

特性exprlet$(( ))
空格要求必须空格不能有空格可有空格
乘法\***
括号\( \)不支持( )
字符串运算✅ 支持❌ 不支持❌ 不支持
返回值输出结果返回状态返回结果
性能较慢(外部命令)快(内置)快(内置)

一句话总结

expr 是全能型表达式计算器,能做算术、比较、字符串运算,但必须用空格分隔,特殊字符要转义,适合简单计算和字符串处理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注