Appearance
运算符
算术运算符
基本算术运算
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"
fi3. 字符串比较使用引号
bash
# 好的做法
if [ "$a" = "$b" ]; then
echo "相等"
fi
# 不好的做法
if [ $a = $b ]; then
echo "相等"
fi总结
运算符的关键点:
- 算术运算符:
+,-,*,/,%,** - 关系运算符:
-eq,-ne,-gt,-lt,-ge,-le - 布尔运算符:
&&,||,! - 字符串运算符:
=,!=,<,>,-z,-n - 文件测试运算符:
-e,-f,-d,-r,-w,-x - 位运算符:
&,|,^,~,<<,>> - 运算符优先级:括号 > 幂运算 > 乘除模 > 加减 > 移位 > 关系 > 相等 > 位运算 > 逻辑
下一节我们将学习注释的使用。