Linux——小白初识shell脚本(二)

文章目录


前言

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提供了多种上下文(如算术扩展、模式匹配等)来解释这些字符串。在使用时,要注意引用的方式,以避免不必要的单词分割和特殊字符处理问题

总结

本章节描述了程序运算符和程序控制流程的内容。如下所示

程序运算符:

运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符

流程控制

单分支结构、双分支结构

相关推荐
AlfredZhao6 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346612 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪13 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理