当前位置: 首页 > 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.xdnf.cn/news/883675.html

相关文章:

  • UE Learning Record
  • Postman环境变量全局变量设置
  • 【Python 算法零基础 4.排序 ⑨ 堆排序】
  • 模电——第四讲场效应管
  • 【SSM】SpringMVC学习笔记8:拦截器
  • clickhouse常用语句汇总——持续更新中
  • 行列式的性质
  • Docker_Desktop开启k8s
  • NLP学习路线图(二十六):自注意力机制
  • 基于机器学习的水量智能调度研究
  • React Router 中 navigate 后浏览器返回按钮不起作用的问题记录
  • MPNet:旋转机械轻量化故障诊断模型详解python代码复现
  • Oracle 的 SEC_CASE_SENSITIVE_LOGON 参数
  • .NET 原生驾驭 AI 新基建实战系列(六):Pinecone ── 托管向量数据库的向量数据库的云原生先锋
  • Java Lambda表达式深度解析:从入门到实战
  • 从零搭建到 App Store 上架:跨平台开发者使用 Appuploader与其他工具的实战经验
  • Thumb-2指令集及其与STM32的关系
  • I2C 外设知识体系:从基础到 STM32 硬件实现
  • 深入解析CI/CD开发流程
  • Spark 写文件
  • mount -o参数含义:
  • 41道Django高频题整理(附答案背诵版)
  • spring的webclient与vertx的webclient的比较
  • MyBatis之测试添加功能
  • Spark大数据分析与实战笔记(第五章 HBase分布式数据库-03)
  • Vim 设置搜索高亮底色
  • 007-nlohmann/json 项目应用-C++开源库108杰
  • 实验分享|小车模型尾部涡流的PIV可视化实验
  • html-<abbr> 缩写或首字母缩略词
  • html文字红色粗体,闪烁渐变动画效果