Skip to content

运算符

算术运算符

基本算术运算

bash
#!/bin/bash

a=10
b=3

# 加法
echo $((a + b))  # 输出:13

# 减法
echo $((a - b))  # 输出:7

# 乘法
echo $((a * b))  # 输出:30

# 除法
echo $((a / b))  # 输出:3

# 取模
echo $((a % b))  # 输出:1

# 幂运算
echo $((a ** b)) # 输出:1000

自增自减

bash
#!/bin/bash

a=10

# 自增
((a++))
echo $a  # 输出:11

# 自减
((a--))
echo $a  # 输出:10

# 前置自增
echo $((++a))  # 输出:11

# 前置自减
echo $((--a))  # 输出:10

算术赋值

bash
#!/bin/bash

a=10

# 加法赋值
((a += 5))
echo $a  # 输出:15

# 减法赋值
((a -= 3))
echo $a  # 输出:12

# 乘法赋值
((a *= 2))
echo $a  # 输出:24

# 除法赋值
((a /= 4))
echo $a  # 输出:6

# 取模赋值
((a %= 4))
echo $a  # 输出:2

关系运算符

数字比较

bash
#!/bin/bash

a=10
b=20

# 等于
if [ $a -eq $b ]; then
    echo "$a 等于 $b"
fi

# 不等于
if [ $a -ne $b ]; then
    echo "$a 不等于 $b"
fi

# 大于
if [ $a -gt $b ]; then
    echo "$a 大于 $b"
fi

# 小于
if [ $a -lt $b ]; then
    echo "$a 小于 $b"
fi

# 大于等于
if [ $a -ge $b ]; then
    echo "$a 大于等于 $b"
fi

# 小于等于
if [ $a -le $b ]; then
    echo "$a 小于等于 $b"
fi

字符串比较

bash
#!/bin/bash

a="hello"
b="world"

# 等于
if [ "$a" = "$b" ]; then
    echo "$a 等于 $b"
fi

# 不等于
if [ "$a" != "$b" ]; then
    echo "$a 不等于 $b"
fi

# 小于(字典序)
if [[ "$a" < "$b" ]]; then
    echo "$a 小于 $b"
fi

# 大于(字典序)
if [[ "$a" > "$b" ]]; then
    echo "$a 大于 $b"
fi

布尔运算符

逻辑与

bash
#!/bin/bash

a=10
b=20

# 使用 -a
if [ $a -gt 5 -a $b -lt 30 ]; then
    echo "条件成立"
fi

# 使用 &&
if [ $a -gt 5 ] && [ $b -lt 30 ]; then
    echo "条件成立"
fi

# 使用 [[ ]]
if [[ $a -gt 5 && $b -lt 30 ]]; then
    echo "条件成立"
fi

逻辑或

bash
#!/bin/bash

a=10
b=20

# 使用 -o
if [ $a -gt 15 -o $b -lt 30 ]; then
    echo "条件成立"
fi

# 使用 ||
if [ $a -gt 15 ] || [ $b -lt 30 ]; then
    echo "条件成立"
fi

# 使用 [[ ]]
if [[ $a -gt 15 || $b -lt 30 ]]; then
    echo "条件成立"
fi

逻辑非

bash
#!/bin/bash

a=10

# 使用 !
if [ ! $a -eq 20 ]; then
    echo "$a 不等于 20"
fi

# 使用 [[ ]]
if [[ ! $a -eq 20 ]]; then
    echo "$a 不等于 20"
fi

字符串运算符

字符串长度

bash
#!/bin/bash

str="hello"

# 检查字符串是否为空
if [ -z "$str" ]; then
    echo "字符串为空"
fi

# 检查字符串是否不为空
if [ -n "$str" ]; then
    echo "字符串不为空"
fi

# 获取字符串长度
echo ${#str}  # 输出:5

字符串匹配

bash
#!/bin/bash

str="hello world"

# 检查是否包含子串
if [[ "$str" == *"world"* ]]; then
    echo "包含 world"
fi

# 检查是否以某个字符串开头
if [[ "$str" == "hello"* ]]; then
    echo "以 hello 开头"
fi

# 检查是否以某个字符串结尾
if [[ "$str" == *"world" ]]; then
    echo "以 world 结尾"
fi

文件测试运算符

文件类型测试

bash
#!/bin/bash

file="test.txt"

# 检查文件是否存在
if [ -e "$file" ]; then
    echo "文件存在"
fi

# 检查是否为普通文件
if [ -f "$file" ]; then
    echo "是普通文件"
fi

# 检查是否为目录
if [ -d "$file" ]; then
    echo "是目录"
fi

# 检查是否为符号链接
if [ -L "$file" ]; then
    echo "是符号链接"
fi

# 检查是否为块设备
if [ -b "$file" ]; then
    echo "是块设备"
fi

# 检查是否为字符设备
if [ -c "$file" ]; then
    echo "是字符设备"
fi

文件权限测试

bash
#!/bin/bash

file="test.txt"

# 检查是否可读
if [ -r "$file" ]; then
    echo "文件可读"
fi

# 检查是否可写
if [ -w "$file" ]; then
    echo "文件可写"
fi

# 检查是否可执行
if [ -x "$file" ]; then
    echo "文件可执行"
fi

文件属性测试

bash
#!/bin/bash

file="test.txt"

# 检查文件是否为空
if [ -s "$file" ]; then
    echo "文件不为空"
fi

# 检查文件是否为套接字
if [ -S "$file" ]; then
    echo "是套接字"
fi

# 检查文件是否为命名管道
if [ -p "$file" ]; then
    echo "是命名管道"
fi

文件比较

bash
#!/bin/bash

file1="file1.txt"
file2="file2.txt"

# 检查 file1 是否比 file2 新
if [ "$file1" -nt "$file2" ]; then
    echo "$file1$file2 新"
fi

# 检查 file1 是否比 file2 旧
if [ "$file1" -ot "$file2" ]; then
    echo "$file1$file2 旧"
fi

# 检查 file1 和 file2 是否是同一个文件
if [ "$file1" -ef "$file2" ]; then
    echo "$file1$file2 是同一个文件"
fi

位运算符

基本位运算

bash
#!/bin/bash

a=5   # 二进制:101
b=3   # 二进制:011

# 按位与
echo $((a & b))  # 输出:1 (001)

# 按位或
echo $((a | b))  # 输出:7 (111)

# 按位异或
echo $((a ^ b))  # 输出:6 (110)

# 按位取反
echo $((~a))     # 输出:-6

# 左移
echo $((a << 1)) # 输出:10 (1010)

# 右移
echo $((a >> 1)) # 输出:2 (10)

位运算赋值

bash
#!/bin/bash

a=5

# 按位与赋值
((a &= 3))
echo $a  # 输出:1

# 按位或赋值
((a |= 2))
echo $a  # 输出:3

# 按位异或赋值
((a ^= 1))
echo $a  # 输出:2

# 左移赋值
((a <<= 1))
echo $a  # 输出:4

# 右移赋值
((a >>= 1))
echo $a  # 输出:2

运算符优先级

优先级从高到低

bash
#!/bin/bash

# 1. 括号
result=$(( (2 + 3) * 4 ))
echo $result  # 输出:20

# 2. 幂运算
result=$(( 2 ** 3 * 4 ))
echo $result  # 输出:32

# 3. 乘除模
result=$(( 10 + 3 * 2 ))
echo $result  # 输出:16

# 4. 加减
result=$(( 10 - 3 + 2 ))
echo $result  # 输出:9

# 5. 移位
result=$(( 8 << 1 + 2 ))
echo $result  # 输出:32

# 6. 关系运算
result=$(( 10 > 5 ))
echo $result  # 输出:1

# 7. 相等运算
result=$(( 10 == 10 ))
echo $result  # 输出:1

# 8. 位与
result=$(( 5 & 3 | 1 ))
echo $result  # 输出:1

# 9. 位异或
result=$(( 5 ^ 3 | 1 ))
echo $result  # 输出:7

# 10. 位或
result=$(( 5 | 3 ))
echo $result  # 输出:7

# 11. 逻辑与
result=$(( 1 && 0 || 1 ))
echo $result  # 输出:1

# 12. 逻辑或
result=$(( 0 || 1 ))
echo $result  # 输出:1

实用示例

示例1:计算器

bash
#!/bin/bash

read -p "请输入第一个数字: " num1
read -p "请输入第二个数字: " num2

echo "加法: $((num1 + num2))"
echo "减法: $((num1 - num2))"
echo "乘法: $((num1 * num2))"
echo "除法: $((num1 / num2))"
echo "取模: $((num1 % num2))"

示例2:判断闰年

bash
#!/bin/bash

read -p "请输入年份: " year

if (( year % 4 == 0 && year % 100 != 0 )) || (( year % 400 == 0 )); then
    echo "$year 是闰年"
else
    echo "$year 不是闰年"
fi

示例3:文件检查

bash
#!/bin/bash

file="test.txt"

if [ -e "$file" ]; then
    if [ -f "$file" ]; then
        echo "是普通文件"
        if [ -r "$file" ]; then
            echo "文件可读"
        fi
        if [ -w "$file" ]; then
            echo "文件可写"
        fi
        if [ -x "$file" ]; then
            echo "文件可执行"
        fi
    elif [ -d "$file" ]; then
        echo "是目录"
    fi
else
    echo "文件不存在"
fi

示例4:数字范围检查

bash
#!/bin/bash

read -p "请输入一个数字: " num

if (( num >= 0 && num <= 100 )); then
    echo "数字在 0 到 100 之间"
else
    echo "数字不在 0 到 100 之间"
fi

最佳实践

1. 使用双括号进行算术运算

bash
# 好的做法
result=$((a + b))

# 不好的做法
result=`expr $a + $b`

2. 使用双括号进行条件判断

bash
# 好的做法
if ((a > b)); then
    echo "$a 大于 $b"
fi

# 不好的做法
if [ $a -gt $b ]; then
    echo "$a 大于 $b"
fi

3. 字符串比较使用引号

bash
# 好的做法
if [ "$a" = "$b" ]; then
    echo "相等"
fi

# 不好的做法
if [ $a = $b ]; then
    echo "相等"
fi

总结

运算符的关键点:

  1. 算术运算符+, -, *, /, %, **
  2. 关系运算符-eq, -ne, -gt, -lt, -ge, -le
  3. 布尔运算符&&, ||, !
  4. 字符串运算符=, !=, <, >, -z, -n
  5. 文件测试运算符-e, -f, -d, -r, -w, -x
  6. 位运算符&, |, ^, ~, <<, >>
  7. 运算符优先级:括号 > 幂运算 > 乘除模 > 加减 > 移位 > 关系 > 相等 > 位运算 > 逻辑

下一节我们将学习注释的使用。