首先继续上次的内容看一下另一个案例

案例:持续检查服务器负载

uptime查看负载情况(也可以用top命令)

[root@localhost ~]# uptime22:11:26 up  7:05,  3 users,  load average: 0.00, 0.00, 0.00
#!/bin/bash
#Function:持续检查服务器负载,如果负载过高则发送警告邮件
while true
doload=$(uptime | awk '{print $10}' | tr -s "," ' ')if [ $(echo "$load > 1.0" | bc) -eq 1 ];thenecho "Warning:Server load is high:$load" | mail -s "Server load warning" admin@example.comfisleep 300
done

(该代码可能执行不成功)

案例:持续监控应用日志

[root@localhost ~]# grep -i "error" /var/log/messages 
Aug 26 19:30:52 localhost /usr/sbin/irqbalance[1044]: Cannot change IRQ 73 affinity: Input/output error
Aug 26 19:30:52 localhost /usr/sbin/irqbalance[1044]: Cannot change IRQ 63 affinity: Input/output error

案例:逐行读取文件

[root@localhost ~]# vim test.sh 
#!/bin/bash
while read line
dousername=$(echo $line | cut -d':' -f1)time=$(echo $line | cut -d':' -f3)time=$(date -d @$[time*24*3600])echo ${username}-$time
done < /root/shadow
[root@localhost ~]# ./test.sh 
root-2025年 09月 08日 星期一 08:00:00 CST
bin-2024年 12月 24日 星期二 08:00:00 CST
daemon-2024年 12月 24日 星期二 08:00:00 CST
adm-2024年 12月 24日 星期二 08:00:00 CST
lp-2024年 12月 24日 星期二 08:00:00 CST
sync-2024年 12月 24日 星期二 08:00:00 CST
shutdown-2024年 12月 24日 星期二 08:00:00 CST
halt-2024年 12月 24日 星期二 08:00:00 CST
mail-2024年 12月 24日 星期二 08:00:00 CST
operator-2024年 12月 24日 星期二 08:00:00 CST
games-2024年 12月 24日 星期二 08:00:00 CST
ftp-2024年 12月 24日 星期二 08:00:00 CST
nobody-2024年 12月 24日 星期二 08:00:00 CST
systemd-coredump-2025年 08月 26日 星期二 08:00:00 CST
dbus-2025年 08月 26日 星期二 08:00:00 CST
polkitd-2025年 08月 26日 星期二 08:00:00 CST
saslauth-2025年 08月 26日 星期二 08:00:00 CST
dhcpd-2025年 08月 26日 星期二 08:00:00 CST
sshd-2025年 08月 26日 星期二 08:00:00 CST
rpc-2025年 08月 26日 星期二 08:00:00 CST
tss-2025年 08月 26日 星期二 08:00:00 CST
apache-2025年 08月 26日 星期二 08:00:00 CST
unbound-2025年 08月 26日 星期二 08:00:00 CST
libstoragemgmt-2025年 08月 26日 星期二 08:00:00 CST
cockpit-ws-2025年 08月 26日 星期二 08:00:00 CST
cockpit-wsinstance-2025年 08月 26日 星期二 08:00:00 CST
pesign-2025年 08月 26日 星期二 08:00:00 CST
chrony-2025年 08月 26日 星期二 08:00:00 CST
tcpdump-2025年 08月 26日 星期二 08:00:00 CST
tom-2025年 09月 08日 星期一 08:00:00 CST
lynn-2025年 09月 08日 星期一 08:00:00 CST
user1-2025年 09月 08日 星期一 08:00:00 CST

循环控制语句continue

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

用法示例:

[root@localhost ~]# vim continue.sh
#!/bin/bash
i=1
while [ $i -le 10 ]
doecho $ilet i++
done
[root@localhost ~]# chmod +x continue.sh 
[root@localhost ~]# ./continue.sh 
1
2
3
4
5
6
7
8
9
10

循环控制语句break

break [N]:提前结束第N层后的全部循环;最内层为第1层,默认为1

[root@localhost ~]# vim break.sh
for((i=0;i<10;i++));do[ $i -eq 5 ] && breakfor((j=0;j<10;j++));do[ $j -eq 5 ] && breakecho $jdoneecho ----------------------------
done
[root@localhost ~]# chmod +x break.sh 
[root@localhost ~]# ./break.sh 
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------

shift技术


shift命令用于对参数的向左移动,通常用于在不知道传入参数个数的情况下依次遍历每个参数,然后进行相应的处理(常见与Linux中各种程序的启动脚本)。在扫描处理脚本程序的参数时,经常要用到shift命令

shift命令每执行一次,参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数不可再用

注意:$#表示脚本后跟随的参数总的个数,$n可以获取脚本后跟随的第n个参数的值

示例:

[root@localhost ~]# vim shift.sh 
#!/bin/bashwhile [ $# -ne 0 ]
doecho "一共$#个参数,内容分别是:"for i in `seq $#`;doecho -n -e "$i\t"doneechoshift
done
[root@localhost ~]# ./shift.sh 1 2
一共2个参数,内容分别是:
1       2
一共1个参数,内容分别是:
1

案例:累加1-100

[root@localhost ~]# vim sum.sh 
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
dolet sum+=$i
done
echo $sum
[root@localhost ~]# ./sum.sh 
5050

Shell中的数组


1.(1)Shell数组的定义

数组的基本定义

Shell中,用小括号()来表示数组,数组元素之间用空格来分隔

[root@localhost ~]# array1=(1 2 3 4 5 6)
[root@localhost ~]# echo ${array1[*]}    #输出数组的所有元素
1 2 3 4 5 6
[root@localhost ~]# echo ${array1[@]}    #输出数组的所有元素
1 2 3 4 5 6
[root@localhost ~]# echo ${array1[0]}    #输出数组的第N个数(由0代表第一个数开始)
1
[root@localhost ~]# echo ${array1[2]}    #输出数组的第3个数
3
(2)采用键值对的形式赋值

Shell中用小括号将变量括起来,同时采用键值对的形式赋值

[root@localhost ~]# array2=([1]=one [2]=two [3]=three)
[root@localhost ~]# echo ${array2[*]}      #输出数组的所有元素 
one two three
[root@localhost ~]# echo ${array2[@]}      #输出数组的所有元素 
one two three
[root@localhost ~]# echo ${#array2[@]}     #输出数组的元素个数 
3
(3)动态定义数组数量

动态地定义数组变量,并使用命令的输出结果作为数组的内容

[root@localhost ~]# array3=($(ls /boot))
[root@localhost ~]# echo ${#array3[*]}   #输出定义数组的元素个数
13
[root@localhost ~]# echo ${array3[0]}
config-6.6.0-72.0.0.76.oe2403sp1.x86_64

2.Shell数组的打印

  • 打印单个数组元素: ${数组名[下标]} 。当未指定数组下标时,下标默认从0开始

  • 打印全部数组内容:${数组名[@]}或 ${数组名[*]}

  • 打印数组元素的个数:${#数组名[@]}或 ${#数组名[*]}

3.Shell数组的赋值

如果下标不存在,则自动添加一个新的元素;如果下标存在,则覆盖原来的值

4.Shell数组的拼接合并

所谓Shell数组拼接(数组合并),就是将两个数组连接成一个数组

拼接数组的思路是:先利用@或者*,将数组扩展成列表,然后再合并到一起,具体格式如下:

[root@localhost ~]# array1=(1 2 3 4 5 6)
[root@localhost ~]# array2=(7 8 9 10 11 12)
[root@localhost ~]# array3=(${array1[@]} ${array2[@]})
[root@localhost ~]# echo ${array3[*]}
1 2 3 4 5 6 7 8 9 10 11 12

5.Shell删除数组元素

Shell中,使用unset关键字来删除数组元素,具体格式如下:

[root@localhost ~]# unset array3[2]
[root@localhost ~]# echo ${array3[*]}
1 2 4 5 6 7 8 9 10 11 12
[root@localhost ~]# unset array3
[root@localhost ~]# echo ${array3[*]}[root@localhost ~]# 

6.获取数组某范围的元素

Shell中直接通过${数组名[@/*]:起始位置:长度}获取数组给定范围内元素,返回字符串,中间用空格分开

[root@localhost ~]# arr1=(1 2 3 4 5)
[root@localhost ~]# echo ${arr1[*]:1:2}
2 3
[root@localhost ~]# echo ${arr1[@]:0:4}
1 2 3 4

mapfile命令


mapfile直接用一个指令交互式的生成一个数组

[root@localhost ~]# ls /boot/ > boot.txt
[root@localhost ~]# mapfile arr6 < boot.txt
[root@localhost ~]# echo ${arr6[*]}
config-6.6.0-72.0.0.76.oe2403sp1.x86_64 dracut efi grub2 initramfs-0-rescue-5a44ea1f344449c0863349ae24820f72.img initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64.img initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64kdump.img loader lost+found symvers-6.6.0-72.0.0.76.oe2403sp1.x86_64.gz System.map-6.6.0-72.0.0.76.oe2403sp1.x86_64 vmlinuz-0-rescue-5a44ea1f344449c0863349ae24820f72 vmlinuz-6.6.0-72.0.0.76.oe2403sp1.x86_64

shell中的函数


shell函数的定义

注意:在shell里不支持函数的参数传入,只支持脚本的参数传入,所以name()内不能写任何东西。

本质的作用就是;将一段重复的代码编入脚本中,放在指定位置,使用时直接调用。

示例

[root@localhost ~]# vim sum.sh
#!/bin/bash
c1=$1
c2=$2
c3=$3
sum() {
sum1=0
for i in $(seq $c1 $c2 $c3)
dolet sum1+=$i
done
echo $sum1
}
sum
[root@localhost ~]# chmod +x sum.sh 
[root@localhost ~]# ./sum.sh 1 100
5050

案例;在子shell里调用的函数在父shell里不能输出

[root@localhost ~]# vim sum.sh
#!/bin/bash
c1=$1
c2=$2
c3=$3
sum() {
sum1=0
for i in $(seq $c1 $c2 $c3)
dolet sum1+=$i
done
return $sum1
}
sum
[root@localhost ~]# ./sum.sh 1 100
[root@localhost ~]# echo $sum1[root@localhost ~]# source sum.sh 1 100
[root@localhost ~]# echo $sum1
5050

return的效果:把结果存储在一个位置上

Shell函数的调用

调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可

Shell的八大扩展功能(不重要)


花括号

在shell脚本中,可以使用括号对字符串进行扩展,我们可以在一对花括号中包含一组以分号分隔的字符串或者字符串序列组成一个字符串扩展,注意最终输出结果以空格分隔,使用该扩展花括号不可以被引号引用,花括号的数量必须是偶数个

[root@localhost ~]# echo {1,5} #对字符串进行扩展
1 5
[root@localhost ~]# echo {hello,world} #对字符串进行扩展
hello world
[root@localhost ~]# echo {a..z} #对字符串序列进行扩展
a b c d e f g h i j k l m n o p q r s t u v w x y z
#字符串后面可以跟一个步长整数,默认为1或-1
[root@localhost ~]# echo {a..z..2}
a c e g i k m o q s u w y
[root@localhost ~]# echo {a..z..3}
a d g j m p s v y
[root@localhost ~]# echo {1..9..3}
1 4 7
[root@localhost ~]# echo {1..9..2}
1 3 5 7 9
[root@localhost ~]# echo "{a..z}" #花括号扩展不能使用引号
{a..z}
[root@localhost ~]# echo t{i,o}p #花括号前后都可以添加可选字符串
tip top
[root@localhost ~]# echo t{o,e{a,m}}p #花括号支持嵌套
top teap temp
#花括号批量操作
[root@localhost ~]# mkdir -p t{o,e{a,m}}p
[root@localhost ~]# touch t{o,e{a,m}}p/{a,b,c,d}e.txt

波浪号

波浪号在Shell脚本中默认代表当前用户家目录

[root@localhost /]# echo ~ #显示当前用户的家目录
/root
[root@localhost /]# echo ~/elk
/root/elk
[root@localhost /]# echo ~elk #显示特定用户的家目录,该用户必须存在
/home/elk
[root@localhost /]# echo ~+ #显示当前工作目录
/
[root@localhost /]# echo ~- #显示前一个工作目录
/root
变量替换

在Shell脚本中我们会使用 对变量进行扩展替换,变量字符可以放到花括号中,这样可以防止需要扩展的变量字符与其他不需要扩展的字符混淆,如果 对变量进行扩展替换,变量字符可以放到花括号中,这样可以防止需要扩展的变量字符与其他不需要扩展的字符混淆,如果 对变量进行扩展替换,变量字符可以放到花括号中,这样可以防止需要扩展的变量字符与其他不需要扩展的字符混淆,如果后面是位置变量且多余一个数字,必须使用{}

[root@localhost ~]# a="hello word"
[root@localhost ~]# echo $a
hello word
[root@localhost ~]# echo ${a}
hello word
[root@localhost ~]# b=a
[root@localhost ~]# echo ${b} #直接返回变量的值
a
[root@localhost ~]# echo ${!b} #间接引用a变量的值
hello word
[root@localhost ~]# c=b
[root@localhost ~]# echo ${!c} #尽可以实现一层简介引用
a

变量替换操作还可以测试变量是否存在及是否为空,若变量不存在或为空,则可以为变量设置一个默认值

Shell脚本支持多种形式的变量测试与替换功能,如下表所示

语法格式功能描述
${变量:-关键字}如果变量未定义或为空,则返回关键字,否则返回变量值
${变量:=关键字}如果变量未定义或为空,则将关键字赋值给变量,并返回结果,否则直接返回变量值
${变量:?关键字}如果变量未定义或为空,则通过标准错误显示包含关键字的错误信息,否则返回变量值
${变量:+关键字}如果变量未定义或为空,则直接返回空,否则返回关键字

唯一要了解basename和dirname,其余的都不重要。

basenamedirname:

basename:可以获取一个路径中的文件名

dirname:仅保留路径,删除文件名

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)

之前在上篇文章Win系统下配置PCL库_windows pcl库 下载-CSDN博客中提到配置PCL库的教程是下载Visual Studio和Qt 5.15.2&#xff0c;后续在测试中我发现前面这两步很重要&#xff0c;一般Qt在线下载器选项选不好的话Qt是装的Qt6&#xff0c;在VTK编译的时候Qt6往往需要C17编译&…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 四(91-)

环境&#xff1a;OpenCV3.2.0 VS201791、合并Y方向重叠的轮廓以轮廓的最小垂直外接矩形框的y为依据&#xff0c;合并y重叠的轮廓。数学逻辑&#xff1a;几何合并的数学表达坐标系统&#xff1a;假设矩形由左上角坐标(x, y)和宽高(width, height)定义。合并公式&#xff1a;合并…

numpy数组的升维和降维的方法集锦

为适配计算包对numpy数组的维度要求&#xff0c;对numpy数组进行升维或降维转化&#xff0c;是非常常见的操作。这里尝试通过多种方式对numpy数组进行升维或降维。1 数组升维1.1 np.expand_dims在0维升维&#xff0c;示例如下a np.array([1,2,3,4,5]) np.expand_dims(a, axis0…

介绍 Python Elasticsearch Client 的 ES|QL 查询构建器

作者&#xff1a;来自 Elastic Miguel Grinberg 学习如何使用 ES|QL 查询构建器&#xff0c;这是一个新的 Python Elasticsearch client 功能&#xff0c;可以更轻松地使用熟悉的 Python 语法构建 ES|QL 查询。 想要获得 Elastic 认证吗&#xff1f;快来了解下一期 Elasticsear…

三坐标测量仪:高精度测量内径检测手段及其实际运用

在工业制造领域中&#xff0c;内径尺寸的精准度直接关系到产品的装配性能、运行稳定性乃至使用寿命。传统检测方法如卡尺、内径千分尺等难以满足高精度、复杂结构件的需求。三坐标测量仪技术的出现&#xff0c;打破了这一困境&#xff0c;成为当前工业领域实现高精度内径检测的…

DIPMARK:一种隐蔽、高效且具备鲁棒性的大语言模型水印技术

摘要水印技术为通过在数据中嵌入隐蔽信息来保障数据安全提供了一种很有前景的方法。该领域的一个首要挑战在于&#xff0c;在水印嵌入过程中保持原始数据的分布。我们的研究拓展并优化了现有的水印框架&#xff0c;着重强调了保持分布&#xff08;DiP&#xff09;水印的重要性。…

IMU传感器价格与高精度惯性导航系统供应商分析

本段将对IMU传感器价格及高精度惯性导航系统的市场情况进行概览。IMU传感器作为惯性导航的重要组成部分&#xff0c;其价格水平受到技术、需求和供应商竞争等多重因素的影响。随着无人机、自动驾驶车辆等新兴应用场景的兴起&#xff0c;IMU传感器的市场需求逐渐攀升。这不仅带动…

3-9〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用REST API提权

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

UE5 基础应用 —— 07 - 角色蓝图 简单使用

目录 一、角色蓝图 1.1 Pawn / Character 1.2 角色基类 1.3 角色基类设置 1.3.1 基础设置 1.3.2 角色移动和相机旋转 1.3.3 角色移动 —— 锁定视角 1.3.4 角色跳跃 1.4 角色派生类设置 1.4.1 添加动画蓝图 一、角色蓝图 1.1 Pawn / Character Pawn / Character 有什…

流畅的Python(二) 丰富的序列

流畅的Python 第二章&#xff1a;丰富的序列 摘要&#xff1a;在日常Python开发中&#xff0c;我们频繁与各种数据结构打交道&#xff0c;其中序列类型&#xff08;如列表、元组、字符串&#xff09;是基石。然而&#xff0c;你是否曾因对它们理解不深&#xff0c;而在性能优化…

嵌入式 - ARM6

一、按键1. 初始化key.c手册C32 - IOMUXC1. 复用功能配置IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B: 低四位&#xff08;0101&#xff09; IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);SION(信号监控)1: 0 //0 DISABLED — Input Path is determined by functionality MUX_…

菊水PBZ电源在蓄电池充放电测试中的应用探讨

通过高速双极性电源PBZ系列进行蓄电池恒流&#xff0c;恒压充电的方法 对于仪器厂商来说&#xff0c;要求“请按照使用说明书使用”是产品的使用方针&#xff0c;或者说是正确用法。但是&#xff0c;作为具有代表性的通用产品&#xff0c;直流电源的实际使用方法可谓五花八门&…

Zephyr嵌入式实时操作系统安装配置

Zephyr简介 Zephyr 是一款由 Linux 基金会 托管的开源实时操作系统(RTOS),专为资源受限的嵌入式设备(从微控制器到小型边缘计算节点)设计,广泛应用于物联网(IoT)、工业自动化、消费电子、医疗设备、汽车电子等领域。其核心优势在于轻量级、高可配置性和对多架构硬件的广…

Linux系统 SELinux 安全管理与故障排查

一、SELinux 安全上下文管理1. SELinux 简介SELinux&#xff08;Security-Enhanced Linux&#xff09;是 Linux 内核的强制访问控制&#xff08;MAC&#xff09;安全子系统&#xff0c;通过基于标签的访问控制实现细粒度权限管理&#xff0c;遵循最小权限原则。SELinux 有三种工…

解密完全二叉树顺序存储之堆结构

前言:各位老铁好&#xff0c;在前面博客中&#xff0c;笔者分享了有关二叉树的博客&#xff0c;在那篇博客中&#xff0c;笔者讲到了完全二叉树的存储结构中有两种存储方式&#xff0c;一种是顺序存储&#xff0c;一种是链式存储&#xff0c;链式存储笔者已经带各位老铁实现过了…

通过针刺!鹏辉能源移动电源电池革新之作 Secu 系列:不燃电解液加持,充电宝安全新选择

9月11日&#xff0c;鹏辉能源对外发布新一代移动电源高安全电池Secu系列。该产品通过采用不燃的电解液破解移动电源产品安全难题&#xff0c;直击当下移动电源安全事故频发的行业痛点&#xff0c;为移动电源行业带来更安全、更可靠的半固态电池解决方案。数字化时代&#xff0c…

软件定义汽车(SDV)与区域电子电气架构(Zonal EEA)的技术革新

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

在 Docker Compose 中解决文件权限不足的问题

在使用 Docker 和 Docker Compose 构建应用时&#xff0c;由于容器中的文件权限不足而导致某些容器可能无法访问宿主机上的文件&#xff0c;或者容器内的文件系统无法正确读取或写入文件。问题描述在我的项目中&#xff0c;我使用 Docker Compose 来启动多个服务&#xff0c;并…

认知语义学对人工智能自然语言处理的深层语义分析:理论启示与实践路径

摘要随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;已成为其核心驱动力之一。然而&#xff0c;尽管以大型语言模型&#xff08;LLMs&#xff09;为代表的现代NLP系统在处理语言任务上取得了前所未有的成功&#xf…

React19 中的交互操作

需要安装的库 antd-mobile、use-immer在App.jsx 中引入组件 Actionimport "./App.css" import Action from "./pages/action" function App() {return (<><Action></Action></>) }export default Appaction.jsx 组件import LearnI…