目录

前言

一、Shell程序运算符

1.运算符基本使用

2. 关系运算符

3. 字符串运算符

4. 布尔/逻辑运算符

5. 文件测试运算符

注意事项

二、流程控制

1. 条件判断 (Conditionals)

a. if 语句

b. if-else 语句

单分支结构 (if)

双分支结构 (if-else)

多分支结构 (if-elif-else)

关键特性总结

总结


前言

在Shell脚本编程中,运算符与流程控制是构建高效逻辑的核心工具。运算符用于处理数据间的计算、比较与逻辑判断,而流程控制则通过条件分支和循环结构实现程序的动态决策能力。掌握这些基础元素,不仅能提升脚本的灵活性,还能优化资源调度与错误处理流程。本节将系统解析算术运算符、关系运算符、逻辑运算符的用法,并详细说明ifcaseforwhile等流程控制结构的应用场景,为编写健壮的自动化脚本奠定基础。

一、Shell程序运算符

Shell 脚本提供了多种运算符,用于执行算术运算、关系比较、布尔逻辑、字符串操作和文件测试等。这些运算符通常在条件测试 [ ][[ ]] 或 (( )) 中使用,或者直接在命令中结合使用。

1.运算符基本使用

用于执行数学运算。注意:在原生 Shell 中处理算术运算时,通常需要使用 expr 命令或 $(( )) 语法。

# 使用 expr (注意:操作符和操作数间需要空格)
sum=$(expr 5 + 3)  # 加法
diff=$(expr 10 - 2) # 减法
prod=$(expr 6 \* 4) # 乘法 (需要转义 *)
quot=$(expr 8 / 2)  # 除法
mod=$(expr 7 % 3)   # 取模

# 使用 $(( )) (更简洁,无需转义)
result=$(( (5 + 3) * 2 )) # 支持嵌套和复杂表达式
echo $result # 输出 16
 

常用算术运算符

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • %:取模(求余数)
  • **:乘方 (仅限 Bash)

2. 关系运算符

用于数值比较(数字)

a=10
b=20

if [ $a -eq $b ]; then # 等于
  echo "a 等于 b"
elif [ $a -ne $b ]; then # 不等于
  echo "a 不等于 b"
elif [ $a -gt $b ]; then # 大于
  echo "a 大于 b"
elif [ $a -lt $b ]; then # 小于
  echo "a 小于 b"
elif [ $a -ge $b ]; then # 大于等于
  echo "a 大于等于 b"
elif [ $a -le $b ]; then # 小于等于
  echo "a 小于等于 b"
fi
 

常用数值关系运算符

  • -eq:等于 (Equal)
  • -ne:不等于 (Not Equal)
  • -gt:大于 (Greater Than)
  • -lt:小于 (Less Than)
  • -ge:大于等于 (Greater or Equal)
  • -le:小于等于 (Less or Equal)

3. 字符串运算符

用于字符串比较和操作

str1="Hello"
str2="World"
str3="Hello"

if [ "$str1" = "$str3" ]; then # 字符串相等
  echo "str1 等于 str3"
fi

if [ "$str1" != "$str2" ]; then # 字符串不相等
  echo "str1 不等于 str2"
fi

if [ -z "" ]; then # 字符串长度是否为0
  echo "空字符串"
fi

if [ -n "$str1" ]; then # 字符串长度是否非0
  echo "非空字符串"
fi

# 字符串拼接
combined="$str1 $str2"
echo $combined # 输出 "Hello World"
 

常用字符串运算符

  • =:字符串相等
  • !=:字符串不相等
  • -z:检查字符串长度是否为 0 (空字符串)
  • -n:检查字符串长度是否非 0 (非空字符串)

4. 布尔/逻辑运算符

用于组合条件判断

a=10
b=20
c=30

# 逻辑与 (AND): -a (在 [ ] 中使用) 或 && (在 [[ ]] 或命令链中使用)
if [ $a -lt $b -a $b -lt $c ]; then # 使用 -a
  echo "a < b 且 b < c"
fi

if [[ $a -lt $b && $b -lt $c ]]; then # 使用 && (需要 [[ ]])
  echo "a < b 且 b < c"
fi

# 逻辑或 (OR): -o (在 [ ] 中使用) 或 || (在 [[ ]] 或命令链中使用)
if [ $a -gt $b -o $a -lt $c ]; then # 使用 -o
  echo "a > b 或 a < c"
fi

# 非 (NOT): !
if [ ! $a -eq $b ]; then
  echo "a 不等于 b"
fi
 

常用逻辑运算符

  • !:非 (NOT)
  • -a:与 (AND) (在 [ ] 内)
  • -o:或 (OR) (在 [ ] 内)
  • &&:与 (AND) (在 [[ ]] 内或命令连接)
  • ||:或 (OR) (在 [[ ]] 内或命令连接)

5. 文件测试运算符

用于测试文件或目录的属性

file="example.txt"

if [ -e $file ]; then # 文件/目录是否存在
  echo "$file 存在"
fi

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

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

if [ -s $file ]; then # 文件大小是否大于0
  echo "$file 非空"
fi

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

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

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

常用文件测试运算符

  • -e:文件/目录是否存在
  • -f:是否为普通文件
  • -d:是否为目录
  • -s:文件大小是否大于0字节
  • -r:文件是否可读
  • -w:文件是否可写
  • -x:文件是否可执行
  • -L:是否为符号链接

注意事项

  1. 空格:在 [ ] 和 [[ ]] 内部,运算符和操作数之间必须有空格。例如 [ $a -eq $b ] 正确,[$a -eq $b] 错误。
  2. 引号:处理包含空格的字符串时,变量引用应放在双引号内,如 [ "$str" = "Hello" ],避免因空格导致语法错误。
  3. [ ] vs [[ ]][ ] 是 test 命令的别名,兼容性更好。[[ ]] 是 Bash 的扩展,支持更强大的模式匹配(如 =~ 正则)和逻辑运算符 &&||,避免了一些分词问题。
  4. 整数变量:对于算术运算,确保变量值是数字,否则可能出错。

二、流程控制

Shell 脚本的流程控制主要包括条件判断循环两大类,它们允许脚本根据不同的条件执行不同的代码块或重复执行某些操作。

1. 条件判断 (Conditionals)

主要用于根据条件决定执行哪段代码。

a. if 语句

基本结构:

if [ condition ]; then
  # 条件为真时执行的命令
fi
 
b. if-else 语句
if [ condition ]; then
  # 条件为真时执行
else
  # 条件为假时执行
fi
 

单分支结构 (if)

当只需要判断一种情况时使用:

# 示例1:温度警告
temperature = 38
if temperature > 37.5:
    print("体温异常!建议复查")  # 条件成立时执行

# 示例2:绝对值计算
num = -5
if num < 0:
    num = -num  # 仅当负数时执行取反
print("绝对值:", num)  # 输出: 5
 

双分支结构 (if-else)

需要处理条件成立/不成立两种对立情况:

# 示例1:奇偶判断
number = 7
if number % 2 == 0:
    print(f"{number} 是偶数")
else:
    print(f"{number} 是奇数")  # 输出: 7 是奇数

# 示例2:登录验证
password = "abc123"
if password == "admin888":
    print("登录成功")
else:
    print("密码错误!")  # 输出: 密码错误!
 

多分支结构 (if-elif-else)

适用于三个及以上互斥条件的情况:

# 示例1:成绩评级
score = 85
if score >= 90:
    grade = "A"
elif score >= 80:  # 90 > score ≥ 80
    grade = "B"    # 此条件满足
elif score >= 70:
    grade = "C"
else:
    grade = "D"
print(f"评级: {grade}")  # 输出: B

# 示例2:BMI分类
bmi = 22.3
if bmi < 18.5:
    category = "偏瘦"
elif bmi < 24:    # 18.5 ≤ bmi < 24
    category = "正常"  # 此条件满足
elif bmi < 28:
    category = "超重"
else:
    category = "肥胖"
print(f"BMI类别: {category}")  # 输出: 正常
 

关键特性总结

  1. 执行顺序:从上到下依次判断,首个满足的条件块被执行
  2. 互斥性if-elif-else结构中只有一个分支会被执行
  3. 可省略else分支不是必需的
  4. 短路原则:在if-elif链中,满足条件后跳过后续判断
graph TD
    A[开始] --> B{条件1}
    B -- 成立 --> C[执行代码块1]
    B -- 不成立 --> D{条件2}
    D -- 成立 --> E[执行代码块2]
    D -- 不成立 --> F[执行默认代码]
    C --> G[结束]
    E --> G
    F --> G
 


总结

Shell脚本的运算符与流程控制共同构成了程序逻辑的骨架。通过合理使用算术运算符(如$((a+b)))、关系运算符(如-eq-ne)及逻辑运算符(如&&||),开发者能精准实现数值计算与条件判断。流程控制方面,if-else结构适用于多分支决策,case语句简化多路匹配,而forwhile循环则分别应对固定遍历和动态条件迭代。需特别注意:

  1. 变量类型明确性:算术操作需用$[]$(())显式声明;
  2. 空格敏感性[ ]测试语句内操作符两侧需保留空格;
  3. 退出状态码:利用$?验证命令执行结果以增强容错。
    熟练运用这些机制,可显著提升脚本的鲁棒性与可维护性。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐