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

Shell编程-3

1. 创建变量方法

1.1. 正常赋值 =形式

dir=/backup hostname=`hostname`

1.2. 脚本传参:$1 =形式

file=$1

1.3. read形式(交互式)

read -p '请输入密码' pass -p 输出提示,如果涉及多行使用echo或cat输出,read去掉-p选项即可 read -t 60 -p '请输入密码' pass -t 等待时间,单位s秒 read -t 60 -s -p '请输入密码' pass -s 终端输入不显示

1.3.1. 案例

案例:数字比较大小

#!/bin/bash ############################################################## # File Name: compare02.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #1.read read -p "请输入第一个数字:" one read -p "请输入第二个数字:" two #2.check if [[ ! ${one} =~ ^-?[0-9]+ ]];then echo "usage: 请输入数字" exit 1 fi if [[ ! ${two} =~ ^-?[0-9]+ ]];then echo "usage: 请输入数字" exit 1 fi #3.compare if [ "$one" -eq "$two" ];then echo "$one和$two相等" elif [ "$one" -gt "$two" ];then echo "$one比$two大" else echo "$one比$two小" fi

2. 计算

2.1. awk/bc

  • 小数整数计算
  • 比较大小
  • bc计算
echo "10/3"|bc -l 3.33333333333333333333 #取余数 echo "10%3" | bc 1
  • awk计算
awk 'BEGIN{print 1/3}' 0.333333 num1=666 num2=999 awk -v n1=$num1 -v n2=$num2 'BEGIN{print n1/n2}' 0.666667 -v修改awk中的变量
  • bc比较大小
mem_use_percent=`free -m | awk 'NR==2{print 100-$NF/$2*100}'` compare=`echo "${mem_use_percent} > 30" | bc` if [ $compare -eq 0 ];then echo "当前内存:${mem_use_percent}%,内存使用率正常,继续摸鱼吧" else echo "当前内存:${mem_use_percent}%,内存使用率过高,请及时处理" fi
  • awk比较大小
mem_use_percent=`free -m | awk 'NR==2{print 100-$NF/$2*100"%"}'` #写法01: echo ${mem_use_percent} 30% | awk '{ if ($1 >= $2) print "当前内存'${mem_use_percent}',内存使用率过高,请及时处理"; else print "当前内存'${mem_use_percent}',内存使用率正常,继续摸鱼吧" }' #写法02: mem_status=`echo ${mem_use_percent} 30% | awk '$1 >= $2{print "high"}'| grep high | wc -l` if [ $mem_status -eq 0 ];then echo "当前内存${mem_use_percent},内存使用率正常,继续摸鱼吧" else echo "当前内存${mem_use_percent},内存使用率过高,请及时处理" fi

2.2. expr

  • 整数计算
  • 检查输入的内容是否为数字
  • 通过[[]]与=~判断是否为数字更准确
expr 6 \* 6

2.3. let $(()) $[]

  • 整数计算
  • 配合循环使用
  • let
i=1 let i=i+1 echo $i 2 let i++ echo $i 3
  • $(())
i=1 echo $((i++)) 1 echo $((i++)) 2 echo $((i++)) 3

3. 检查案例

3.1. 计算内存的使用率

空闲率 free -m | awk 'NR==2{print $NF/$2*100"%"}' 使用率 free -m | awk 'NR==2{print 100-$NF/$2*100"%"}'
  • 脚本
#!/bin/bash ############################################################## # File Name: check_mem.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #1.vars mem_totle=`free -m | awk 'NR==2{print $2}'` mem_available=`free -m | awk 'NR==2{print $(NF)}'` mem_idle_percent=`free -m | awk 'NR==2{print $NF/$2*100"%"}'` mem_use_percent=`free -m | awk 'NR==2{print 100-$NF/$2*100"%"}'` #2.cat cat<<EOF 总内存:${mem_totle} 可用内存:${mem_available} 空闲率:${mem_idle_percent} 使用率:${mem_use_percent} EOF #3.if echo ${mem_use_percent} 30% | awk '{ if ($1 >= $2) print "内存使用率过高,请及时处理"; else print "内存使用率正常,继续摸鱼吧" }'

3.2. 检查https证书是否过期

#https证书检查 curl -v https://www.baidu.com #过期时间 expire date: Aug 9 01:41:01 2025 GMT 把过期日期转换成-->秒 把今天日期转换成-->秒 date +%s date -d "Aug 9 01:41:01 2025 GMT" +%s 1754703661 date +%s 1749181157 echo "(1754703661-1749181157)/86400" | bc 63

3.3. 检查域名是否过期

  • 使用whois检查域名
#麒麟安装软件jwhois yum -y install jwhois #使用二级域名 whois baidu.com Expiration Date: 2028-10-11T11:05:17+0000 date -d "2028-10-11T11:05:17+0000" +%s 1854875117 date +%s 1749181157 echo "(1854875117-1749181157)/86400" | bc 1223

4. 循环

  • for
  • while循环(当型循环)
    • 死循环
    • 通过循环读取文件

4.1. for循环

1.常用 for 变量 in 列表 do 命令 done 2.for循环格式(语言形式) for((i=1;i<=10;i++)) do echo $i done 第一次运行循环,i=1 进行判断i<=10是否成立,成立继续循环,否则结束循环 执行do,done之间的命令 循环结束运行i++,进行下一次循环 第二次循环,i=2 进行判断i<=10是否成立,成立继续循环,否则结束循环 执行do,done之间的命令 循环结束运行i++,进行下一次循环

4.2. while循环

基本格式,当条件满足,执行do,done之间的命令 while [ 条件 ] do 命令 done i=1 while [ $i -le 10 ] do echo $i let i++ done

4.2.1. 死循环

while true do echo xxxx done while true do date +%T sleep 5 done
  • 案例17:猜数字脚本(1-100之间),进行猜测
1.运行脚本 1)生成随机数字(1-100)之间 num=$((RANDOM%100+1)) 2)通过while read 输入的数字与目标数字对比 一致输出对了并退出脚本 大了,输出减小数字 小了,输出加大数字
  • 脚本
#!/bin/bash ############################################################## # File Name: guess.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #1.vars num=$((RANDOM%100+1)) #2.compare while true do read -p "请输入1-100之间的数字:" user_num if [[ ! "${user_num}" =~ ^[0-9]+ ]];then echo "输入的不是数字,请重新输入" continue fi if [ $user_num -gt ${num} ];then echo "大了" elif [ $user_num -lt ${num} ];then echo "小了" else echo "恭喜你猜对了,答案是$num" exit fi done

4.2.2. 读取文件

  • 格式
while read 变量名 do echo ${变量名} done <文件名
  • 案例18:批量对ip.txt文件内容进行ping检查和curl/wget检查
wget --spider www.jd.com
  • 案例19:书写一个脚本,通过交互方式获取用户需要检查ip或域名,用户输入q则结束获取,然后调用ping,curl/wget对这些
#!/bin/bash ############################################################## # File Name: 19.check_ip.sh # Version: V1.0 # Author: zbl # Organization: www.zbl.com # Description: ############################################################## #1.vars temp_file=`mktemp` #2.while while true do read -p "请输入要检查的ip或域名,输入q结束:" ip [ -z "${ip}" ] && { echo "输入错误请重新输入" continue } [ "${ip}" = "q" ] && { echo "输入完成,正在检查......" break } echo "${ip}" >>${temp_file} done #3.check ip while read line do #ping ping -c 1 ${line} >/dev/null 2>&1 if [ $? -eq 0 ];then echo "${line} 可以ping通" else echo "${line} 不可以ping通" fi #wget wget --spider -T 2 -t 2 ${line} >/dev/null 2>&1 if [ $? -eq 0 ];then echo "${line} 可以访问" else echo "${line} 不可以访问" fi done <${temp_file}

4.3. 循环控制

循环控制

说明

exit

退出脚本

continue

跳过当前循环,结束当前循环,进入下次循环

break

打断,结束循环

return

函数中使用

5. 总结

  • read
  • 计算:awk/bc,let.expr
  • while循环:死循环与读取文件
  • continue

http://www.jsqmd.com/news/464613/

相关文章:

  • WSL端口代理配置全攻略:从零开始实现本地IP访问(附常见问题排查)
  • ansible变量-循环-判断-jinja2模板
  • 5分钟搞定Flink1.19本地部署:用JDK17运行WordCount示例教程
  • 7步掌握 Angular 项目的 Pull Request 评审流程:从提交到合并的完整指南
  • ansible变量-调试-优化
  • docker容器安装与使用
  • 【Gromacs】使用伞形采样研究Her2蛋白聚集的详细操作指南
  • 国产数据库新选择:GBase-8a单机版在Linux下的保姆级安装教程(附常见问题解决)
  • STM32以太网开发实战:DP83848 vs LAN8742选型指南(附CubeMX配置)
  • MATLAB模糊控制器实战:从零搭建智能小费计算系统(附完整代码)
  • Mysql 笔记
  • PyTorch反向传播实战:从计算图到梯度下降的完整代码解析(附可视化训练过程)
  • 从数学推导到代码实现:手把手教你写PyTorch自定义权重初始化
  • 杰理AC701N的板级配置AD的使用
  • Qt信号槽进阶指南:从Qt4到Qt5的信号重载与槽函数优化(避坑大全)
  • 从零到专业:3个AI提示词框架让你工作效率翻倍(含避坑指南)
  • 1为何扣子空间智能体默认不支持短信与邮件发送:技术沙盒、安全合规与插件生态深度解析
  • FPGA开发者的效率神器:3种方法解决Vivado多版本默认启动问题(含拖拽技巧)
  • WinForm程序如何优雅地请求管理员权限?3种方法实测对比(含UAC原理)
  • DIN 75220 标准汽车阳光模拟试验与户外试验对比研究
  • 04. Capture 中 Part Manager 应用场景(二)管理变种 BOM I OrCAD X Capture CIS 设计小诀窍第三季
  • EtherCAT从零到实战:如何用树莓派搭建低成本运动控制原型(附IGH配置指南)
  • SQLyog保姆级教程:从安装到实战操作MySQL数据库(附常见问题解决)
  • 华为云ModelArts实战:5分钟搞定深度学习模型训练(附OBS上传避坑指南)
  • 从路由器转发到代码实现:图解分组交换时延计算全流程
  • 从Shadertoy到Cesium:那些GLSL移植踩过的坑(烟雾效果调试实录)
  • 实时美颜滤镜卡顿怎么办?美颜sdk滤镜特效开发优化方案
  • 从修车工视角看OBD:揭秘4S店不会告诉你的10个诊断仪使用技巧
  • 项目日程规划工具有哪些?2026年热门产品推荐与测评
  • MMDVM盒子pi-star系统4G网卡配置全攻略:从识别到路由优化