文章目录
前言
Shell脚本编程中,运算符与流程控制是构建逻辑的核心基础。本章将系统学习各类运算符的运用,并通过单双分支结构实现程序流程的精准控制,为编写高效脚本奠定坚实基础。
一、程序运算符
1、运算符的基本使用
基本运算符:expr、 (())、 []
注意:使用expr时,乘号要加上转义字符。即
bash
`expr 2 \* 4`
示例1:通过上述基本运算符进行加法的运算
bash
#!/bin/bash
str1=`expr 1 + 1`
str2=$((3+3))
str3=$[4+4]
echo "expr运算结果:${str1}"
echo "$(())运算结果:${str2}"
echo "$[]运算结果:${str3}"

示例2:count++演示
bash
#!/bin/bash
count=1
((count++))
echo "${count}"

示例3:加减乘除演示
bash
#!/bin/bash
str1=2
str2=10
echo "加:$((str1+str2))"
echo "减:$((str1-str2))"
echo "乘:$((str1*str2))"
echo "除:$((str2/str1))"

2、关系运算符
2.1、运算符列表
注意:关系运算符只支持数字,不支持字符串,除非字符串的值是数字

2.2、大于等于和大于
bash
#!/bin/bash
[ 2 -gt 1 ] && echo "大于"
[ 2 -ge 1 ] && echo "大于等于"

2.3、小于等于和小于
bash
#!/bin/bash
[ 2 -lt 3 ] && echo "小于"
[ 2 -le 3 ] && echo "小于等于"

2.4、等于和不等于
bash
#!/bin/bash
[ 1 -eq 1 ] && echo "等于"
[ 1 -ne 2 ] && echo "不等于"

3、逻辑运算符
3.1、逻辑运算符概述
-a:双方都成立(and) 表达式1 --a 表达式2
-o:单方成立(or) 表达式1 --o 表达式2

3.2、逻辑运算符应用
bash
[ 1 -eq 1 -a 2 -ne 3 ] && echo '-a正常' || echo "false"
[ 1 -eq 2 -o 2 -ne 3 ] && echo '-o正常' || echo "false"
[ 1 -eq 1 ] && [ 2 -ne 3 ] && echo '&&正常' || echo "false"
[ 1 -eq 2 ] || [ 2 -ne 3 ] && echo '||正常' || echo "false"

注意:|| 和 && 没有优先级关系,直接从左到右执行。如果你需要选定逻辑符先执行,可以加上()
3.3、场景应用
示例1:查找登入用户数量作判断
bash
[ $(who | wc -l) -lt 5 ] && echo "登入用户太少"

示例2:服务器资源紧张报警
bash
freecc=$(free -m | grep Mem | awk '{print $4}')
echo $freecc
[ ${freecc} -le 10000 ] && echo "内存紧张" || echo "内存充足"

4、字符串运算符
4.1、字符串运算符列表
bash
-n STRING 字符串长度不为零 (非空字符串)
z STRING 字符串长度为0(空字符串)
= 判断两个字符串是否一样
!= 判断两个字符串是否不一样
4.2、字符串运算符应用
示例1:使用-n判断字符串是否为空
-n "$str" 为真,因为字符串非空。即字符串长度不为0
bash
#!/bin/bash
read -p "输入字符串:" str
if [ -n "$str" ];then
echo "字符串不为空"
else
echo "字符串为空"
fi

示例2:使用-z判断字符串是否为空
z "$str" 为真,因为字符串为空。字符串长度为0
bash
#!/bin/bash
read -p "输入字符串:" str
if [ -z "$str" ];then
echo "字符串为空"
else
echo "字符串不为空"
fi

示例3:判断两个字符串是否相等
bash
#!/bin/bash
read -p "输入字符串1:" str1
read -p "输入字符串2:" str2
if [ $str1 = $str2 ];then
echo '= 字符串相等'
else
echo '= 字符串不相等'
fi
if [ $str1 != $str2 ];then
echo '!= 字符串不相等'
else
echo '!= 字符串相等'
fi

5、文件测试运算符
5.1、运算符说明

5.2、文件测试运算符应用
bash
注意:test -d /etc/sysconfig/ 等同于 [ -d /etc/sysconfig/ ]
示例1:基础用法

示例2:取反用法

二、流程控制
1、概述
任何程序都有默认的执行流程,通常是从上向下 逐行依次执行。
bash
#!/bin/bash #先执行的第1行
num=100 #第2行
((num++)) #第3行
echo $num #第4行
当希望对程序的默认执行流程进行控制,需要学习:流程控制
选择:有选择性的执行某行或某段程序
重复:一直重复性的执行某行或某段程序,至到执行结束(条件控制循环执行的次数)
Shell提供了丰富的语句判断方式,包括数字,字符串和文件
2、if-else
2.1、单分支
2.1.1 格式说明
if 条件测试操作; then
命令序列
fi
2.1.2 单分支应用
示例1:判断挂载点是否存在,不存在则重建
bash
#!/bin/bash
mount_dir="/media/cdrom"
if [ ! -d ${mount_dir} ];then
mkdir ${mount_dir}
else
rm -rf ${mount_dir}
mkdir ${mount_dir}
echo "已存在目录,删除重新创建"
fi

示例2:判断结尾输入是否为.sh
bash
#!/bin/bash
read -n 12 -p '输入带.sh的文件名称:' filename
if [[ ${filename} == *.sh ]];then
echo "输入格式正确"
fi

注意:-n限制字符数太少。会导致输出和参数输入显示在同一行

2.2、双分支
2.2.1 格式说明
双分支 if 语句只是在单分支的基础上针对"条件不成立"的情况执行另一种操作,而不是 "坐视不管"地不执行任何操作
执行机制:判断一次条件,有两个不同结果
- 条件成立(true):执行 then 后面的代码(命令1)
- 条件失败(false):执行 else 后面的代码(命令2)
2.2.2 双分支应用
示例1:判断主机是否存活
bash
#!/bin/bash
# ip=192.168.10.101
read -p "请输入ip: " ip
ping -c 4 -i 0.2 -w 3 $ip &> /dev/null # 发送4个包,间隔0.2秒,最多等待3秒,不显示输出
if [ $? -eq 0 ]; then
echo "$ip is up"
else
echo "$ip is down"
fi


示例2:用户不存在则重新创建并设置密码
bash
#!/bin/bash
read -p "输入用户名称:" name
if id $name > /dev/null;then
echo "用户已存在"
else
useradd $name
echo 123456 | passwd --stdin $name &> /dev/null
echo "重新创建并设置密码"
fi

示例3:判断当前用户是否管理员
bash
#!/bin/bash
if [ $UID -eq 0 ];then
echo "当前登入的用户是管理员root"
else
echo "不是root"
fi

示例4:检查目录
bash
#!/bin/bash
read -p "输入字符串:" filename
if ls $filename > /dev/null
then
echo "目录存在"
else
echo "请输入正确路径"
fi

示例5:查看并启动阿帕奇服务
grep 退出状态码规则与其他命令不同。如下所示:
- 0 = 成功找到匹配内容
- 1 = 没有找到匹配内容
- 2 = 命令执行错误(如文件不存在、权限问题等)
bash
#!/bin/bash
netstat -antulp | grep ":80" > /dev/null 2>&1 # 将正常信息丢入黑洞不显示。错误信息丢入到和正常信息一样的地方。(也是黑洞)
# 整句意思为只执行代码,不显示其他信息
if [ $? -eq 0 ];then
echo "服务已运行"
else
echo "启动服务"
yum install -y httpd > /dev/null
systemctl start httpd
fi

示例6:猜数字游戏
bash
#!/bin/bash
num=50
read -p "请输入一个数字:" number
if [ $number -eq $num ];then
echo "猜对了"
elif [ $number -gt $num ];then
echo "猜大了"
else
echo "猜小了"
fi

3、总结
bash
1、$[]:作算术运算。比如:+、-、 *、 /、 >=、==
2、[]: 作简单的逻辑判断, -gt、-ge。比如: if []
3、[[]]:增强运算符。-gt、-ge、-lt
4、$(command) 是命令替换的语法,它会执行括号中的命令,并将命令的标准输出作为字符串返回。
5、Shell 的赋值规则
在 Shell 中,等号右边只能是:纯字符串、命令替换的结果、变量替换的结果
小知识:命令替换和变量替换的结果在Shell中都是字符串,但是Shell提供了多种上下文(如算术扩展、模式匹配等)来解释这些字符串。在使用时,要注意引用的方式,以避免不必要的单词分割和特殊字符处理问题
总结
本章节描述了程序运算符和程序控制流程的内容。如下所示
程序运算符:
运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符
流程控制
单分支结构、双分支结构