当前位置: 首页 > news >正文

day028-Shell自动化编程-判断进阶

文章目录

  • 1. 特殊变量补充
  • 2. 变量扩展-变量子串
    • 2.1 获取变量字符的长度
    • 2.2 给变量设置默认值
  • 3. 命令
    • 3.1 dirname
    • 3.2 basename
    • 3.3 cut
  • 4. 条件测试命令:[]
    • 4.1 逻辑运算符
    • 4.2 文件测试
    • 4.3 案例:书写脚本-检查文件类型
    • 4.4 逻辑运算
    • 4.5 案例:书写脚本-检查服务是否正在运行或是开机自启动
    • 4.6 增强版条件测试命令:[[]]
    • 4.7 面试题:[]与[[]]的区别?
  • 5. 字符串比较
    • 5.1 案例:书写脚本-检查服务是否正在运行和开机自启动
  • 6. 多分支:if、case
    • 6.1 案例-统计根分区磁盘使用率,60-70输出警告,70-80输出需要处理,80-95输出需要及时处理,965以上输出立刻处理
    • 6.2 案例:判断系统类型
  • 7. 踩坑记录
    • 1. 条件测试时,变量要加上双引号
  • 8. 思维导图

1. 特殊变量补充

  • $$:获取当前脚本的pid
  • $_:获取上一个命令的最后一个参数;在命令行中可以使用Esc+.快捷键

2. 变量扩展-变量子串

  • 用于对变量处理、加工

2.1 获取变量字符的长度

[root@aliyun-ubuntu ~]# name=skx
[root@aliyun-ubuntu ~]# echo $name
skx
[root@aliyun-ubuntu ~]# echo ${#name}
3

2.2 给变量设置默认值

格式说明
${para:-word}变量para没定义或为空时,word作为默认值,不修改原内容
${para:=word}变量para没定义或为空时,word作为默认值,修改原内容
  • ${para:-word}
# 变量为空
[root@aliyun-ubuntu ~]# echo $name# 为变量设置默认值,不修改原内容
[root@aliyun-ubuntu ~]# echo ${name:-root}
root
[root@aliyun-ubuntu ~]# echo $name
  • ${para:=word}
[root@aliyun-ubuntu ~]# echo $name # 为空变量设置默认值,并修改原内容
[root@aliyun-ubuntu ~]# echo ${name:=skx}
skx
[root@aliyun-ubuntu ~]# echo $name
skx

3. 命令

3.1 dirname

  • 显示路径前缀
[root@aliyun-ubuntu ~]# dirname /etc/passwd
/etc
[root@aliyun-ubuntu ~]# dirname /etc/ssh/ssh_config
/etc/ssh

3.2 basename

  • 显示路径后缀
[root@aliyun-ubuntu ~]# basename /etc/passwd
passwd
[root@aliyun-ubuntu ~]# basename ./snap/lxd/
lxd

3.3 cut

  • -c n-m:截取字符串的第n到第m个字符
[root@aliyun-ubuntu ~]# string=1234567890
[root@aliyun-ubuntu ~]# echo $string |cut -c 5
5
[root@aliyun-ubuntu ~]# echo $string |cut -c 5-8
5678

4. 条件测试命令:[]

[ ]或test,用于检查文件属性、字符串比较、数值比较等逻辑判断。它是 Shell 脚本中常见的条件判断语法之一。

  • []内部必须用空格分隔

4.1 逻辑运算符

  • 逻辑运算符不能在[]内使用
  • &&:并且,前面命令执行成功后才执行后面的命令
  • ||:或者,前一个命令执行失败后才执行后面的命令

4.2 文件测试

选项说明
-f文件是否为普通文件
-d文件是否为目录
-x文件是否有执行权限
-s文件大小大于0
-h/-L文件是否为软链接
[root@aliyun-ubuntu ~]# [ -f ./passwd.txt ] && echo file || echo 'not file'
file
[root@aliyun-ubuntu ~]# [ -d /etc/ ] && echo dir || echo 'not dir'
dir
[root@aliyun-ubuntu ~]# [ -d /etc/passwd ] && echo dir || echo 'not dir'
not dir

4.3 案例:书写脚本-检查文件类型

[root@aliyun-ubuntu /server/scripts]# cat check_type.sh 
#!/bin/bash
##############################################################
# File Name: check_type.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:test file type
##############################################################
export LANG=en.US_UTF-8# vars
file=$1
# command
# check param num
if [ $# -eq 0 ];thenecho "Usage:$0 file/dir"exit 1
fi
# soft link
if [ -h $file ];thenecho "$file is symbolic"exit 0
fi
# file
if [ -f $file ];thenif [ -x $file ];thenmode="has permisson"else mode="has not permission"fiif [ -s $file ];thensize="size not is 0"elsesize="size is 0"fiecho "${file} is file;permission:${mode};size:${size}"exit 0
fi
# dir
if [ -d $file ];thenecho "$file is directory"exit 0
fiecho "$file is other type file"
[root@aliyun-ubuntu /server/scripts]# bash check_type.sh
Usage:check_type.sh file/dir
[root@aliyun-ubuntu /server/scripts]# bash check_type.sh /sbin
/sbin is symbolic
[root@aliyun-ubuntu /server/scripts]# bash check_type.sh ./check_type.sh 
./check_type.sh is file;permission:has not permission;size:size not is 0
[root@aliyun-ubuntu /server/scripts]# bash check_type.sh /usr/   
/usr/ is directory
[root@aliyun-ubuntu /server/scripts]# bash check_type.sh ./test
./test is other type file

4.4 逻辑运算

逻辑运算符说明
-a并且
-o或者
取反

4.5 案例:书写脚本-检查服务是否正在运行或是开机自启动

[root@aliyun-ubuntu /server/scripts]# cat check_service2.sh 
#!/bin/bash
##############################################################
# File Name: check_service2.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
name=$1
# command
if [ $# -eq 0 ];thenecho "Usage:$0 server name"exit 1
firunning=`systemctl is-active $name`
enable=`systemctl is-enabled $name`
if [ ${running}="active" -a ${enable}="enabled" ];thenecho "$name is running and enabled"
elseecho "$name is not running or enabled"
fi
[root@aliyun-ubuntu /server/scripts]# bash check_service2.sh
Usage:check_service2.sh server name
[root@aliyun-ubuntu /server/scripts]# bash check_service2.sh sshd
sshd is running and enabled

4.6 增强版条件测试命令:[[]]

[[ ]],比 [] 更强大,支持 &&||、正则匹配等

  • 正则匹配符号:=~,前后要有空格
[root@aliyun-ubuntu /server/scripts]# id=678
[root@aliyun-ubuntu /server/scripts]# [[ "$id" =~ [0-9]+ ]] && echo 1 || echo 2
1
[root@aliyun-ubuntu /server/scripts]# name=skx123
[root@aliyun-ubuntu /server/scripts]# [[ "$name" =~ [0-9]+ ]] && echo 1 || echo 2
1
[root@aliyun-ubuntu /server/scripts]# [[ "$name" =~ ^[0-9]+$ ]] && echo 1 || echo 2
2

4.7 面试题:[]与[[]]的区别?

基本条件测试命令:[]扩展条件测试命令:[[]]
无法使用正则可以使用正则
只能使用选项比价大小:-eq、-lt、-gt……可以使用选项,也能用字符:==、>=、<=……
逻辑符号只能用-a、-o、!逻辑符号能用选项,也能用&&、||

5. 字符串比较

符号说明
=“字符串” = “字符串”,注意加双引号和空格
!=判断不相等
-zzero,判断变量是否为空格
-nnot zero,判断变量是否不为空
[root@aliyun-ubuntu /server/scripts]# [ 123=123 ] && echo 1 || echo 2
1
[root@aliyun-ubuntu /server/scripts]# name="skx"
[root@aliyun-ubuntu /server/scripts]# [ ${name}="skx" ] && echo 1 || echo 2
1

5.1 案例:书写脚本-检查服务是否正在运行和开机自启动

[root@aliyun-ubuntu /server/scripts]# cat check_service.sh
#!/bin/bash
##############################################################
# File Name: check_service.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:check service status
##############################################################
export LANG=en.US_UTF-8# vars
service=$1# command
# check parameter num
if [ $# -eq 0 ];thenecho "Usage:$0 service name"exit 1
fi
# check running state
status_run=`systemctl is-active ${service}`
if [ ${status_run}="active" ];thenecho "${service} is running"
elseecho "${service} is not running"
fi# check enabled state
status_enabled=`systemctl is-enabled ${service}`
if [ ${status_enabled}="enabled" ];thenecho "${service} is enabled"
elseecho "${service} is not enabled"
fi
#####################################
if [ ${status_run}="active" -a ${status_enabled}="enabled" ];thenecho "$service is active and enabled"
fi
[root@aliyun-ubuntu /server/scripts]# bash check_service.sh sshd
sshd is running
sshd is enabled
sshd is active and enabled

6. 多分支:if、case

6.1 案例-统计根分区磁盘使用率,60-70输出警告,70-80输出需要处理,80-95输出需要及时处理,965以上输出立刻处理

[root@aliyun-ubuntu /server/scripts]# cat check_disk.sh
#!/bin/bash
##############################################################
# File Name: check_disk.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################export LANG=en.US_UTF-8# vars
usage=`df -h / |awk -F '[ %]' 'NR==2{print $(NF-2)}'`
# if
if [ $usage -gt 60 -a $usage -le 70 ];thenecho "Warning: Insufficient disk space ${usage}"
elif [ $usage -gt 70 -a $usage -le 80 ];thenecho "Warning: Insufficient disk space ${usage}"
elif [ $usage -gt 80 -a $usage -le 95 ];thenecho "Warning: Severe shortage of disk space ${usage}"
elif [ $usage -gt 95 ];thenecho "Warning: Disk space is about to run out ${usage}"
elseecho "Disk space is normal"
fi
[root@aliyun-ubuntu /server/scripts]# bash check_disk.sh
Disk space is normal

6.2 案例:判断系统类型

  • bash运行脚本是一个子shell程序,里面的变量仅在脚本中生效
  • source运行的脚本是在当前Shell环境,可以用来加载指定的变量
[root@aliyun-ubuntu /server/scripts]# cat check_os.sh
#!/bin/bash
##############################################################
# File Name: check_os.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################export LANG=en.US_UTF-8
# This file contains system version information
source /etc/os-release
# case
case "$ID" in kylin|rocky|centos) echo "$ID yum insatll package";;ubuntu|debian) echo "$ID apt install package";;*)echo "other system"esac[root@aliyun-ubuntu /server/scripts]# bash check_os.sh 
ubuntu apt install package

7. 踩坑记录

1. 条件测试时,变量要加上双引号

变量建议加引号

  • 如果变量可能为空或包含空格,必须加引号:
if [ "$var" = "hello" ]; then  # 正确
if [ $var = "hello" ]; then    # 如果 $var 为空,会报错

8. 思维导图

【金山文档】 思维导图 https://www.kdocs.cn/l/co3I7PtpTYQX

http://www.lqws.cn/news/158113.html

相关文章:

  • 验证电机理论与性能:电机试验平板提升测试效率
  • 用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析
  • 【HarmonyOS 5】 影视与直播详以及 开发案例
  • Qt多线程访问同一个数据库源码分享(基于Sqlite实现)
  • 一次Oracle的非正常关闭
  • 十八、【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案
  • Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强
  • oracle数据恢复—oracle数据库执行truncate命令后的怎么恢复数据?
  • 大疆相关知识收集
  • 深度解码:我如何用“结构进化型交互学习方法”与AI共舞,从学习小白到构建复杂认知体系
  • 从 ClickHouse、Druid、Kylin 到 Doris:网易云音乐 PB 级实时分析平台降本增效
  • 短视频矩阵系统技术saas源头6年开发构架
  • 【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理
  • 05【Linux经典命令】Linux 用户管理全面指南:从基础到高级操作
  • Hive中ORC存储格式的优化方法
  • 服务器CPU被WMI Provider Host系统进程占用过高,导致系统偶尔卡顿的排查处理方案
  • 26考研 | 王道 | 计算机组成原理 | 四、指令系统
  • [蓝桥杯]堆的计数
  • 第14节 Node.js 全局对象
  • 华为云CentOS配置在线yum源,连接公网后,逐步复制粘贴,看好自己对应的版本即可,【新手必看】
  • 《中国电信运营商骨干网:历史、现状与未来演进》系列 第三篇:双网驱动的联通:从南北分家到CUBE-Net的融合创新
  • Java 异步编程难题及拆解技术
  • STL——栈和队列和优先队列
  • 谐波在线监测装置功能
  • Java八股文——集合「Queue篇」
  • LangchainRAG you need - 段落拆分
  • 欧拉公式简明推导
  • 【Android基础回顾】七:内存管理机制
  • 2025.5.28【33OJ NOI 模拟赛 T3】字符串(AC自动机, 字符串后缀结构)
  • Mybatis动态SQL语句