Shell结构化命令:让脚本拥有判断与决策能力

Shell结构化命令:让脚本拥有判断与决策能力 一、if-then 基础结构if-then是Shell中最基本的条件判断结构。与其他编程语言不同Bash的if判断的是命令的退出状态码而非布尔值。1. 基本语法bashif commandthencommandsfi· if后面的命令退出状态码为0成功时then后的命令才执行· fi表示if语句结束2. 单行写法使用分号bashif command; thencommandsfi3. 实际示例bash#!/bin/bash# 检查用户是否存在if who | grep zhang; thenecho 用户zhang已登录fi如果grep找到了匹配行退出码0则输出提示信息。---二、if-then-else 双分支当需要在条件成立和不成立时执行不同操作时使用elsebash#!/bin/bashif who | grep zhang; thenecho 用户zhang已登录elseecho 用户zhang未登录fi---三、elif 多分支当有多个条件需要依次判断时使用elif避免嵌套过多bash#!/bin/bashscore85if [ $score -ge 90 ]; thenecho 等级Aelif [ $score -ge 80 ]; thenecho 等级Belif [ $score -ge 70 ]; thenecho 等级Celseecho 等级Dfi---四、test命令与方括号[]test命令允许测试命令退出码之外的条件包括数值、字符串和文件。1. 两种等价写法bash# 写法一使用test命令if test condition; thencommandsfi# 写法二使用方括号推荐if [ condition ]; thencommandsfi关键注意方括号与内部内容之间必须有空格[ condition ]正确[condition]错误。2. 数值比较参数含义-eq等于-ne不等于-gt大于-ge大于等于-lt小于-le小于等于bash#!/bin/bashnum10if [ $num -gt 5 ]; thenecho $num 大于 5fi# 只支持整数# [ 3.14 -gt 1 ] 会报错3. 字符串比较参数含义/字符串相等字符串不等\ / \小于/大于需转义-n字符串长度非零-z字符串长度为零bash#!/bin/bashstr1hellostr2world# 相等性比较if [ $str1 $str2 ]; thenecho 相等elseecho 不相等fi# 大小写敏感if [ ABC abc ]; thenecho 相等 # 不会执行fi# 检查变量是否为空if [ -z $var ]; thenecho var是空值fi注意和在方括号中必须转义\、\否则会被当作重定向符号。4. 文件比较参数含义-e文件/目录存在-f是普通文件-d是目录-r可读-w可写-x可执行-s文件非空-nt比另一个文件新-ot比另一个文件旧bash#!/bin/bashfile/home/zhang/test.shif [ -e $file ]; thenecho 文件存在if [ -x $file ]; thenecho 且具有可执行权限fielseecho 文件不存在fi---五、复合条件测试布尔逻辑使用与和||或组合多个条件bash# 与两个条件都成立才为真if [ -f $file ] [ -x $file ]; thenecho 文件存在且可执行fi# 或至少一个条件成立即为真if [ $user root ] || [ $user admin ]; thenecho 具有管理员权限fi---六、双括号 (( )) 与双方括号 [[ ]]1. 双括号 (( )) —— 高级数学运算允许在比较中使用更丰富的数学表达式不需要转义大于号/小于号bash#!/bin/basha10b5# 数学比较if (( a b )); thenecho $a 大于 $bfi# 复杂表达式if (( (a * 2) (b 3) )); thenecho a*2 大于 b3fi2. 双方括号 [[ ]] —— 高级字符串比较支持模式匹配通配符和正则bash#!/bin/bashstrhello123# 模式匹配通配符if [[ $str hello* ]]; thenecho 以hello开头fi# 正则表达式匹配if [[ $str ~ ^[a-z][0-9]$ ]]; thenecho 字母开头数字结尾fi---七、if嵌套实战if语句中可以嵌套另一个if实现更精细的判断bash#!/bin/bash# 综合示例检查文件状态并分类处理filetest.txtif [ -e $file ]; thenecho 文件 $file 存在if [ -f $file ]; thenecho 它是普通文件if [ -s $file ]; thenecho 文件内容非空line_count$(wc -l $file)echo 共 $line_count 行elseecho 文件为空fielif [ -d $file ]; thenecho 它是目录elseecho 它是其他类型文件fielseecho 文件 $file 不存在# 创建文件touch $fileecho 已创建空文件 $filefi---八、综合实战脚本结合所有知识点编写一个用户管理检查脚本bash#!/bin/bash# 综合实战用户与文件检查脚本echo 系统检查工具 # 1. 检查当前用户current_user$(whoami)echo 当前用户$current_user# 2. 检查用户是否为rootif [ $current_user root ] || (( UID 0 )); thenecho 权限管理员elseecho 权限普通用户fi# 3. 检查指定用户是否存在check_userzhangif who | grep -q $check_user; thenecho $check_user 当前已登录elseecho $check_user 未登录fi# 4. 检查一个文件的状态target_file/etc/passwdif [ -e $target_file ]; thenecho $target_file 存在if [ -f $target_file ] [ -r $target_file ]; thenline$(wc -l $target_file)echo 可读共 $line 行fiif [ -w $target_file ]; thenecho 文件可写注意权限风险fielseecho $target_file 不存在fi# 5. 数字判断双括号num15if (( num 10 num 20 )); thenecho num ($num) 在10到20之间fi# 6. 字符串模式匹配双方括号emailtestexample.comif [[ $email ~ ^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ ]]; thenecho 邮箱格式有效elseecho 邮箱格式无效fiecho 检查完成 exit 0九、知识框架总结类别结构/命令用途关键注意单分支if ... then ...fi条件成立则执行判断命令退出码0双分支if ... else ...fi条件成立/不成立分别处理多分支if ... elif ... fi多个条件依次判断数值比较[ $a -gt $b ]整数比较【】内需空格字符串比较[ $s1$s2 ]字符串相等/大小引号包裹变量文件比较[ -f $file ]检查文件类型/权限复合条件/高级数学(( a b ))复杂数值比较不用转义高级字符串[[ str pattern ]]模式匹配/正则功能更强大