shell脚本编程基础(中)

news2025/7/22 14:30:20

目录

(一)shell流程控制-for循环语句

1. for 循环介绍

2. for语法

2.1 for 语法一

2.2 for语法二

3.循环控制语句

3.1 sleep N 脚本执行到该步休眠N秒

3.2 continue 跳过循环中的某次循环

3.3 break 跳出循环继续执行后续代码

3.4实例

(二)shell流程控制-while循环语句

1. while循环介绍

2.while循环语法

3. while实战

(三)shell流程控制-until循环语句

1. until介绍

2. until语法

3.案例

(四)shell流程控制-case条件判断语句

1. case介绍

2. case语法

3. shell特殊变量

 (五)shell函数

1.函数介绍

2.函数的语法

3.函数的应用

3.1定义一个函数

3.2函数应用

4.实战

(六)正则表达式

1.正则表达式介绍

2.特殊字符

限定符:

3. POSIX特殊字符


(一)shell流程控制-for循环语句


脚本在执行任务的时候,总会遇到需要循环执行的时候,比如说我们需要脚本每隔五分钟执行一次ping的操作,除了计划任务,我们还可以使用脚本来完成,那么我们就用到了循环语句。

1. for 循环介绍


很多人把for循环叫做条件循环,或者for i in 。其实前者说的就是for的特性,for循环的次数和给予的条件是成正比的,也就是你给5个条件,那么他就循环5次;后者说的是for的语法。

循环的优点:

  1. 节省内存(完成同一个任务)
  2. 结构更清晰
  3. 节省时间成本

2. for语法


2.1 for 语法一

for var in value1 value2 ......
    do
        commands
done

循环输出1-9数字

#!/bin/bash
for i in `seq 1 9`        #seq 1 9 是从1数到9
    do
        echo $i
done

2.2 for语法二

C式的for命令

for ((变量;条件;自增减运算  ))
   do
          代码块
done

输出1-9

#!/bin/bash
for (( i=1;i<10;i++ ))
    do
        echo $i
done

for循环使用多个变量

#!/bin/bash
for (( a=0,b=9;a<10;a++,b-- ))
    do
        echo $a,$b
done

for 无限循环 使用((;;)) 条件可以实现无线循环

#!/bin/bash
for ((;;))
    do
        echo "hehe"
done

3.循环控制语句

3.1 sleep N 脚本执行到该步休眠N秒

#!/bin/bash
for i in `seq 9 -1 0`
    do
        echo -n -e "\b$i"
        sleep 1
done
echo

3.2 continue 跳过循环中的某次循环

默认循环输出1-9,但是使用continue跳过输出5

#!/bin/bash
for (( i=1;i<10;i++ ))
    do
        if [ $i -eq 5 ]
            then
                continue
            else
                echo $i
            fi
done

3.3 break 跳出循环继续执行后续代码

默认循环输出1-9,当输出到5的时候跳出循环

#!/bin/bash
for (( i=1;i<10;i++ ))
    do
        echo $i
        if [ $i -eq 5 ]
            then
                break
            fi
done

3.4实例

#监控主机存活的脚本
for ((;;))
    do
        ping -c1 $1 &>/dev/null        #-c1是是发送一个请求包,并将返回数据放进回收站
        if [ $? -eq 0 ]
            then 
                echo "`date +"%F %H:%M:%S"`: $1 is UP"
            else 
                echo "`date +"%F %H:%M:%S"`: $1 is DOWN"
            fi
        #脚本节奏控制 生产环境下建议1分钟及以上
        sleep 3
done

(二)shell流程控制-while循环语句


1. while循环介绍

while在shell中也是负责循环的语句,和for一样。因为功能一样,很多人在学习和工作中的脚本遇到循环到底该使用for还是while呢?很多人不知道,就造就了有人一遇到循环就是for或者一位的while。我个人认为可以按照我说的这个思想来使用,既知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如我们作业中要求写的猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。所以这样的循环我就建议大家用while了。

2.while循环语法

while  [ condition ]      #注意,条件为真while才会循环,条件为假,while停止循环
 do
             commands
done

丈母娘选金友鑫条件:

read -p "money:" money
read -p "car:" car
read -p "house:" house
while [ $money -lt 1000000000 ] || [ $car -lt 1 ] || [ $house -lt 1 ]
    do
        echo "不行"
        read -p "money:" money
        read -p "car:" car
        read -p "house:" house
done
 
echo "给你了"

3. while实战

1、使用while 遍历文件内容

#使用while遍历文件内容
#!/bin/bash
while read i
    do
        echo "$i"
done < $1

2、使用while读出文件中的列,IFS指定默认的列分隔符

#使用while读出文件中的列,IFS指定默认的列分隔符
#!/bin/bash
IFS=$":"
while read f1 f2 f3 f4 f5 f6 f7
    do
        echo "$f1 $f2 $f3"
done < /etc/passwd        

3、九九乘法表

#九九乘法表
#!/bin/bash
n=1
while [ $n -lt 10 ];do
    for ((m=1;m<=$n;m++));do
        echo -n -e "$m*$n=$((m*n))\t"
    done
    echo
    n=$((n+1))
done

(三)shell流程控制-until循环语句


1. until介绍

和while正好相反,until是条件为假开始执行,条件为真停止执行。

2. until语法

until [ condition ]      #注意,条件为假until才会循环,条件为真,until停止循环
 do
         commands代码块
done

3.案例

  • 打印10-20数字
#!/bin/bash
init_num=10
until [ $init_num -gt 20 ]
   do
       echo $init_num
       init_num=$((init_num + 1))
done

(四)shell流程控制-case条件判断语句


1. case介绍

在生产环境中,我们总会遇到一个问题需要根据不同的状况来执行不同的预案,那么我们要处理这样的问题就要首先根据可能出现的情况写出对应预案,根据出现的情况来加载不同的预案。

2. case语法

case 变量  in 
条件1)
           执行代码块1
;;
条件2)
           执行代码块2
;;
......
esac

注意:每个代码块执行完毕要以;;结尾代表结束,case结尾要以倒过来写的esac来结束。

案例说明

#!/bin/bash
read -p "NUM: " N
case $N in
1)
   echo haha
;;
2)
  echo hehe
;;
3)
   echo heihei
;;
*)
   echo bye
;;
esac

3. shell特殊变量

特殊参数:

 (五)shell函数


1.函数介绍

建议大家把代码模块化,一个模块实现一个功能,哪怕是一个很小的功能都可以,这样的话我们写代码就会逻辑上比较简单,代码量比较少,排错简单,这也就是函数的好处。

函数的优点:

  1. 代码模块化,调用方便,节省内存
  2. 代码模块化,代码量少,排错简单
  3. 代码模块化,可以改变代码的执行顺序

2.函数的语法

语法一:

函数名 () {
    代码块
    return N
    }

语法二:

function 函数名 {
      代码块
      return N
      }

3.函数的应用

3.1定义一个函数

print () {
    echo "welcome to ayitula"

或者

function hello {
    echo "hello world"
}

print 和 hello就是函数的名字,函数名字命名参考变量一节中的变量命名规则

3.2函数应用

定义好函数后,如果想调用该函数,只需通过函数名调用即可。

#!/bin/bash
N1 () {
    echo "`date +%F`"
}
N2 () {
    echo -e "\t\t\t\twelcome to ayitula"
    echo -e "\n"
}
N3 () {
    echo "1) 剪子"
    echo "2) 石头"
    echo "3) 布"
}
N4 () {
    echo -e "\n\n\n"
    read -p "请输入代码: " DL
}
 
#调用代码
N2
N1
N3
N4

4.实战

nginx启动管理脚本

#!/bin/bash
#nginx service manage script
 
#variables
nginx_install_doc=/usr/local/nginx
proc=nginx
nginxd=$nginx_install_doc/sbin/nginx
pid_file=$nginx_install_doc/logs/nginx.pid
nginx_process_id=`cat $pid_fileps`
ngnix_process_num=`ps aux |grep nginx_process_id|grep -v "grep"|wc -l`
#Source function library
if [ -f /etc/init.d/functions ];then
    . /etc/init.d/functions
else
    echo "not found /etc/init.d/functions"
    exit
fi
 
#function
start () {
#如果nginx没有启动直接启动,否则报错已经启动
if [ -f $pid_file ];tnen
    if [ -f $pid_file ]&&[ $ngnix_process_num -ge 1 ];then
        echo "nginx running ......"
    else
        if [ -f $pid_file ]&&[ $ngnix_process_num -lt 1 ];then
        rm -f $pid_file    
        echo "ngin start `daemon $nginxd`"
    fi
    echo "ngin start `daemon $nginxd`"
fi
}
 
 
stop () {
    if [ -f $pid_file ]&&[ $ngnix_process_num -ge 1 ];then
        action "ngnix stop" killall -s QUIT $proc
        rm -f $pid_file
    else
        action "nginx stop" killall -s QUIT $proc 2>/dev/null
    fi
}
 
restart () {
    stop
    sleep 1
    start
}
 
reload () {
    if [ -f $pid_file ]&&[ $ngnix_process_num -ge 1 ];then
        action "nginx reload" killall -s HUP $proc
    else
        action "nginx reload" killall -s HUP $proc 2>/dev/null
    fi
}
 
status () {
    if [ -f $pid_file ]&&[ $ngnix_process_num -ge 1 ];then
        echo "nginx running ..."
    else
        echo "nginx stop"
    fi
}
 
 
#callable
case $1 in
start) start;;
stop) stop;;
restart) restart;;
reload) reload;;
status) status;;
*) echo "USAGE:$0 start|stop|restart|reload|status"
esac

(六)正则表达式


1.正则表达式介绍

正则表达式是一种文本模式匹配,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从数据中匹配出自己想要的数据。

        正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!

2.特殊字符

定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头和结尾,做模糊匹配。

 

#精确匹配  以a开头c结尾的字符串
egrep "^ac$" file 
 
#模糊匹配  以a开头的字符串
egrep "^a" file 
 
#模糊匹配 以c结尾的字符串
egrep "c$" file  

匹配符:匹配字符串

 

#精确匹配  以a开头c结尾  中间任意  长度为三个字节的字符串
egrep "^a.c$" file
 
#精确匹配  以a开头c结尾  中间不包含a-z,0-9  长度为三个字节的字符串
egrep "^a[^a-z0-9]c$" file
 
#精确匹配  以e开头f结尾  中间是*号  长度为三个字节的字符串  e*f
egrep "^e\*f$" file 
 
#精确匹配 以a开头b或c结尾  中间是任意  长度为三个字节的字符串
egrep "^a.(b|c)$" file 
 
#模糊匹配  以cc结尾的字符串   因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
egrep "(cc)$" file

限定符:

对前面的字符或者字符串做限定说明

 

#精确匹配 以a开头 c结尾 中间是有b或者没有b 长度不限的字符串
egrep "^ab*c$" file
 
#精确匹配 以a开头 c结尾 中间只出现一次b或者没有b的字符串
egrep "^ab?c$" file 
 
#精确匹配 以a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
egrep "^ab+c$" file
 
#精确匹配 以a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
egrep "^ab{2,4}c$" file 
 
#精确匹配 以a开头 c结尾 中间是有b且正好出现三次的字符串
egrep "^ab{3}c$" file 
 
#精确匹配 以a开头 c结尾 中间是有b且至少出现一次的字符串
egrep "^ab{1,}c$" file

3. POSIX特殊字符


 注意 [[ ]] 双中括号的意思: 第一个中括号是匹配符[]匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]

#精确匹配  以a开头c结尾  中间a-zA-Z0-9任意字符  长度为三个字节的字符串
egrep "^a[[:alnum:]]c$" file
 
#精确匹配  以a开头c结尾  中间是a-zA-Z任意字符  长度为三个字节的字符串
egrep "^a[[:alpha:]]c$" file
 
#精确匹配  以a开头c结尾  中间是0-9任意字符  长度为三个字节的字符串
egrep "^a[[:digit:]]c$" file
 
#精确匹配  以a开头c结尾  中间是a-z任意字符  长度为三个字节的字符串
egrep "^a[[:lower:]]c$" file
 
#精确匹配  以a开头c结尾  中间是A-Z任意字符  长度为三个字节的字符串
egrep "^a[[:upper:]]c$" file
 
#精确匹配  以a开头c结尾  中间是非空任意字符  长度为三个字节的字符串
egrep "^a[[:print:]]c$" file
 
#精确匹配  以a开头c结尾  中间是符号字符  长度为三个字节的字符串
egrep "^a[[:punct:]]c$" file
 
#精确匹配  以a开头c结尾  中间是空格或者TAB符字符  长度为三个字节的字符串
egrep "^a[[:blank:]]c$" file
egrep "^a[[:space:]]c$" file
 
#精确匹配  以a开头c结尾  中间是十六进制字符  长度为三个字节的字符串
egrep "^a[[:xdigit:]]c$" file

案例

  • 匹配合法的IP地址
egrep '^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$' —color ip.txt
  • 匹配座机电话号码
egrep '^[[:graph:]]{12}$” number |egrep “^(0[1-9][0-9][0-9]?)-[1-9][0-9]{6,7}$'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis大数据量插入方案

1、前言 在开发过程中&#xff0c;有时我们会碰到将大批量的数据入库的场景&#xff0c;那么我们一般有下面三种方式入库&#xff1a; ExecutorType.BATCH批处理方式插入foreach循环标签插入MyBatisPlus自带的saveBatch批量新增方法 下面我们用一个案例来测试一下&#xff0…

让学前端不再害怕英语单词(一)

有很多跟着我学习的学生经常跟我抱怨前端的单词很多&#xff0c;学了css又忘了html的单词&#xff0c;学了js又忘了css 的单词&#xff0c;所以本着给跟着我学习的学生提供一个学习前端不怕英语单词的课程&#xff0c;就打算写一篇博客去讲述如何增强在学习前端的时候巩固语法并…

通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录

文章目录jwt的问题jwt的请求流程图gtoken的优势注意问题演示demo入门示例运行效果启动项目&#xff1a;访问不认证接口&#xff1a;返回成功未登录时访问认证接口&#xff1a;返回错误提示请求登录接口&#xff1a;返回token携带token再次访问认证接口&#xff1a;返回成功分析…

postgres-operator 原理解析- 章节 I

这篇文章我想写postgres-operator如何利用kubernetes实现高可用功能其中的客户端流量路由部分。 总体的目的呢就是客户端数据库连接请求&#xff0c;如果通过利用kubernetes的机制实现将流量路由到实际的Postgresql主节点。 基础知识 Services without selectors 平常得Ser…

【Java进阶篇】第三章 常用类

文章目录一、String类1、String类概述2、String字符串的存储原理3、有String型属性的对象4、两种字符串对象创建方式的区别5、String类的特殊构造方法6、String类中的方法二、StringBuffer类1、StringBuffer类的构造方法2、String类和StringBuffer类的区别3、StringBuffer和Str…

我修复了一个 Vite Bug,让我的项目首屏性能提高了 25%

本文正在参加「金石计划 . 瓜分6万现金大奖」 一次偶然的机会&#xff0c;我将项目&#xff08;基于 tdesign-vue-next-starter &#xff09;由 Vite 2.7 升级成 Vite 3.x 后&#xff0c;发现首次运行 Vite dev 构建&#xff0c;页面首屏时间非常长&#xff0c;且一定会整个页…

Vue3基础看这一篇就够了(万字长篇,附实例代码及效果演示)

目录 前言 概述 Vue3组合式api VS Vue2选项式api 基础部分 setup 选项式api的风格 组合式api的风格 区别 响应式数据 ref reactive shallowReactive 与 shallowRef 计算属性和监听 computed 函数 watch 函数 watchEffect 生命周期 响应式数据只读 toRaw 返回代…

呼叫中心中间件(mod_cti基于FreeSWITCH)-背景音(彩话)接口

背景音&#xff0c;就是给通话添加一个背景音&#xff0c;比如办公室的噪音&#xff0c;键盘敲击声&#xff0c;等。彩话&#xff0c;就是通话过程播放一个声音&#xff0c;代替人工说话&#xff0c;这个声音双方可以同时听到&#xff0c;而且播放过程不影响双方通话。 用处 …

「JVS低代码开发平台」关于逻辑引擎的触发讲解

JVS逻辑引擎是代码开发套件中的业务瓶装的核心&#xff0c;用于去实现各种场景下的逻辑功能&#xff0c;可以把他理解为一个程序配置器与程序的执行器。 逻辑引擎是可以被多种配置器调用的触发的&#xff0c;从而实现了各种业务场景中对应功能的实现&#xff0c;那么接下来我们…

RabbitMQ初步到精通-第四章-RabbitMQ工作模式-PUB/SUB

第四章-RabbitMQ工作模式-PUB/SUB 1.模式介绍 1.1 模式 此模式称为发布订阅模式&#xff0c;从此模式开始&#xff0c;我们就不再使用默认的交换机了&#xff0c;开始定义我们自己的交换机。 此发布订阅模式&#xff0c;使用的交换机类型为Fanout。定义好交换机&#xff0c;消…

【MATLAB教程案例42】语音信号的MFCC特征提取matlab仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 本课程学习成果预览: 目录 1.软件版本 2.MFCC理论概述

JavaScript之BOM复习(54th)

1、BOM概述 1、BOM Browser Object Model 浏览器对象模型 2、它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是 window 3、BOM 由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多方法与属性 4、BOM 缺乏标准&#xff0c;JavaScript 语法的…

用QT实现一个简单的桌面宠物

有时候桌面空空的&#xff0c;或者屏幕空旷了&#xff0c;我们就可以找一点东西来点缀一下&#xff0c;那么桌面宠物是一个不错的选择。 作为一个程序猿&#xff0c;如何实现一个桌面宠物呢&#xff1f; 本文就给大家带来的是如何用qt提供一种思路并写一个简单的桌面宠物。 思…

深入理解Linux网络技术内 幕(八)——设备注册和初始化

文章目录前言设备注册之时设备除名之时分配net_device结构NIC注册和除名的架构设备初始化设备驱动程序初始化设备类型初始化&#xff1a;xxx_setup函数可选的初始化和特殊情况net_device结构的组织查询设备状态队列规则状态注册状态设备的注册和除名切割操作&#xff1a;netdev…

C#编程的构成要素(结合unity做实例分析)

目录 定义变量 变量的名称很重要 将变量作为占位符 疯狂的方法 方法驱动行为 方法也是占位符 类的引入 一直在使用类 日常蓝图 注释是关键 将脚本附加到游戏对象上 脚本成为组件 类与组件通信 本文主要来自<<C#实践入门>>哈里森.费隆 著&#xff0c;仅用…

甘露糖-聚乙二醇-氨基|mannose-PEG-NH2|氨基-PEG-甘露糖

甘露糖-聚乙二醇-氨基|mannose-PEG-NH2|氨基-PEG-甘露糖 氨基&#xff08;Amino&#xff09;由一个氮原子和两个氢原子构成&#xff0c;化学式为-NH2。在有机化学中&#xff0c;氨基是基本碱基&#xff0c;大多数含有氨基的有机物都有一定碱的特性&#xff0c; 中文名称&…

基于数学形态学的路面裂缝图像处理技术-含Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、图像预处理✳️ 三、路面裂缝图像的边缘检测✳️ 3.1 裂缝识别✳️ 3.2 裂缝区域信息获取✳️ 3.3 裂缝特征提取✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 对于路面裂缝而言&#xff0c; 采用图像处理技术对其进行识别与计…

③计算机病毒实验实验报告

班级 计科2101 姓名 彭彭头 学号 时间 2022年5月6日 成绩 实验项目名称 计算机病毒实验二 实验目的 1、了解脚本病毒的感染方式。 2、了解脚本病毒的手工清除方法。 实验内容 通过批处理文件进行计算机病毒和编写&#xff0c;了解脚本病毒的感染方式。 实验环…

Java笔记(十三)

文献种类&#xff1a;专题技术总结文献 开发工具与关键技术&#xff1a; IntelliJ IDEA、Java 语言 作者&#xff1a; 方建恒 年级&#xff1a; 2020 撰写时间&#xff1a; 2022 年 11 月 18 日 Java笔记(十三) 今天我给大家继续分享一下我的Java笔记&#xff0c; 我们继续来…

【Linux】环境基础开发工具使用

Vim Vim 是一个编辑器 只能编辑&#xff0c;只能写代码 直接输入vim &#xff1a; q就是退出 touch新文件&#xff0c;vim 进入 vim是一款多模式的编辑器 命令模式&#xff08;默认打开的模式&#xff09; 按 i 进入编辑模式/插入模式 esc回到命令模式 冒号进入底行…