数组与文本处理


Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。
测试工具——test命令
test 
操作符         作用   
-d               测试文件是否为目录文件(Directory)
-f                测试文件是否为普通文件(File)
-e               测试目录或文件是否存在(Exist)。建议使用-e,-a可能不准确。
-a              测试目录或文件是否存在(Exist)
-r              测试当前用户是否有权限读取(Read)
-w             测试当前用户是否有权限写入(Write)
-x              测试当前用户是否有权限执行(eXcute)
-L              测试是否为符号链接(软链接文件)
-nt            判断文件A是否比文件B新-ot判断文件A是否比文件B旧
-ef            判断两个文件是否为同一文件。可用于硬链接,主要判断两个文件是否指向同一个inode。
-s FILE      判断文件是否存在且非空
-t fd    fd 指定文件描述符是否在某终端已经打开
-N FILE    文件自从上一次被读取之后是否被修改过
-O FILE    当前有效用户是否为文件属主
-G FILE    当前有效用户是否为文件属组

操作符    含义
-eq    等于(Equal)
-ne    不等于(Not Equal)
-gt    大于(Greater Than)
-lt    小于(Lesser Than)
-le    小于或等于(Lesser or Equal)
-ge    大于或等于(Greater or Equal)

逻辑测试(短路运算)
-a或&& :逻辑与,“而且”的意思,全真才为真。
-o或|| :逻辑或,“或者”的意思,一真即为真。
! :逻辑否。

使用三元运算符
使用 if语句双分支结构

ping命令:
-c,发送包的个数。
-i,发送的间隔时间。
-w(小写),多少秒后停止ping操作。
-W(大写),以毫秒为单位设置ping的超时时间 。

1.
if  判断条件
 ​
 then  条件成立的分支代码
 ​
 fi

2.
if 判断条件1
 then
     条件1为真的分支代码
 ​
 elif 判断条件2
 then
     条件2为真的分支代码
 ​
 elif 判断条件3
 then
     条件3为真的分支代码
 ​
 ...
 else
     以上条件都为假的分支代码
 ​
 fi

3.
 case 变量引用 in
 模式1)
     命令分支1
     ;;
 模式2)
     命令分支2
     ;;
 ...
 *)
     默认命令分支
 esac

测试文件是否存在时,建议使用-e。如:[ -e /etc/passwd ]

七个小实验
检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限。

vim cunzai.sh
 #!/bin/bash
 #author:yu
 #date:2022/04/08
 ​
 [ -e ~/test.sh ]
 ​
 if [ $? -eq 0 ];then
    echo "test.sh存在"
    [ -x ~/test.sh ]
    if [ $? -eq 0 ];then
        echo "有执行权限"
    else
        echo "没有执行权限"
     fi
 else
    echo "test.sh不存在"
 fi

提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入决赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入决赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误。
vim paobu.sh
 read -p "请输入您的100米赛跑秒数:" time
 ​
 if [ $time -gt 0 ] && [ $time -le 10 ]
 then
     echo "恭喜您进入决赛"
     read -p "请输入您的性别(男、女):" gender
     if [ $gender = "男" ]
     then
         echo "您进入男生组"
     elif [ $gender = "女" ]
     then
         echo "您进入女生组"
     else
         echo "输入有误,请重新输入"
     fi
 elif [ $time -gt 10 ]
 then
     echo "很遗憾,您无缘决赛"
 else
     echo "输入有误,请重新输入"
     bash $0
 fi


用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录。

case $1 in
 *.tar.gz)
   echo "解压gz格式的压缩包"
   tar -zxvf $1 -C /opt/
   ;;
 *.tar.bz2)
   echo "解压bz2格式的压缩包"
   tar -jxvf $1 -C /opt/
   ;;
 *)
   echo "文件格式有误,无法解压"
 esac

提示用户输入内容,使用if 语句判断输入的内容是否为整数
vim zhengshu.sh
 #!/bin/bash
 #判断用户输入的数是否为整数
 
 read -p "请输入一个数字:" a
 let i=$a+1 &> /dev/null
 ​
 if [ $? -eq 0 ]
 then
      echo "${a}是整数"
 else
      echo "${a}不是整数"
 fi


根据上一题,在整数的情况下再判断输入的内容是奇数还是偶数。
vim jishu.sh
 #!/bin/bash
 #判断用户输入的数是否为整数
 #如果是整数,则继续判断是奇数还是偶数。
 ​
 read -p "请输入一个数字:" a
 let i=$a+1 &> /dev/null
 if [ $? -eq 0 ]
 then
      echo "$a是整数"
      b=$[${a}%2]
      case $b in
      0)
         echo "$a是偶数"
         ;;
      *)
         echo "$a是奇数"
      esac
 else
      echo "$a不是整数"
 fi

用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中(#chkconfig: 2345 99 20),使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务;如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”
cd /etc/init.d
vim firewalld
#!/bin/bash
 #chkconfig: 2345 99 20   //必须加这一行,该脚本才能被chkconfig管理
 ​
 case $1 in
 start)
    echo "正在启动firewalld"
    systemctl start firewalld
    ;;
 stop)
    echo "正在关闭firewalld"
    systemctl stop firewalld
    ;;
 status)
    echo "查看firewalld的状态"
    systemctl status firewalld
    ;;
 restart)
    echo "正在重启firewalld"
    systemctl restart firewalld
    ;;
 *)
    echo "用法: $0 {start|stop|status|restart}"
 esac


chmod +x firewalld           //为脚本增加执行权限
chkconfig --add firewalld    //把该脚本加入系统服务管理中
chkconfig --list firewalld

service firewalld start
service firewalld stop
service firewalld status

循环:遍历、迭代、递归 。
遍历(traversal) - 按规则访问非线性结构中的每一项。
迭代(iterate) - 按顺序访问线性结构中的每一项。
递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况
常见的循环命令:for, while, until。

for循环语句   遍历
 1.依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
 2.如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"

for 变量名 in 取值列表
 do
    命令序列
 done

for遍历三种方式:
for i in {1..10}
for i in $(seq 1 10)
for ((i=1;i<=10;i++))

遍历奇数的三种方式
for i in {1..10..2}
for i in $(seq 1 2 10)
for ((i=1;i<=10;i+=2))

遍历偶数:
for i in {2..10..2}
for i in $(seq 2 2 10)
for ((i=2;i<=10;i+=2))

示例1  批量添加用户
用户名存放在users.txt文件中,每行一个
初始密码均设为123456
vim users.txt
liyi
 lisan
 liwu
 liliu
vim for2.sh 
for user in $(cat /root/users.txt)
 do
    useradd $user
    echo "123456" | passwd --stdin $user
 done
bash for2.sh 

实列2:根据IP地址检查主机状态
IP地址存放在ips.txt文件中,每行一个
使用ping命令检测各主机的连通性
vim ips.txt
192.168.92.10
 192.168.92.22
 192.168.92.1
vim for3.sh
for host in $(cat /data/ips.txt)
 do
    ping -c 3 -i 0.5 -w 4 $host &> /dev/null
    if [ $? -eq 0 ]
    then
        echo "$host is up"
    else
        echo "$host is down"
    fi
 done

实列三:生成8位随机密码(使用字符串分片的方法)
生成8位随机密码,密码范围为26个大小写英文字母和10个阿拉伯数字。
先定义密码取值范围:26个大小写英文字母和10个阿拉伯数字
每次取1个字符。
循环取8次
vim passran.sh
string="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for i in {1..8}
do
 #每次循环随机获取0到字符串长度减1的下标值
    num=$[RANDOM % ${#string}]
    #进行字符串截取,每次随机取出1个字符
    var=${string:$num:1}
    #每次追加生成的密码,passwd+=$var等同于passwd=$passwd$var
    passwd+=$var
 done
 echo "本次生成的密码为:$passwd"

多线程执行脚本(并行执行)

普通for循环是串行,一个一个执行。
在do和done中间增加 { } 符号,可以多线程同时执行。

ping 192.168.72.0/24网段内的所有主机。


vim for4.sh
 #!/bin/bash
 #多线程,同时ping多台主机
 ​
 for ip in 192.168.72.{1..254}
 do
   {
   ping -c3 -w2 $ip &>/dev/null
   if [ $? -eq 0 ]
   then
       echo "$ip is up" >> /opt/up.txt
   else
       echo "$ip is down" >> /opt/down.txt
   fi
   }&
 #{ }表示多线程同时执行
 #增加 & 符号,表示将进程放到后台运行,后台命令之间是不区分先来后到关系的
done
wait

分隔符的作用演示:
使用for读取文件内容,文件中有空格


for的三个默认分隔符
空格、制表符 \t、换行符 \n。

使用for读取文件内容,文件中有空格
vim fen1.sh     //写脚本
 #!/bin/bash
 ​
 #从文件中获取变量值,$()表示调用命令执行的结果
 for name in $(cat name.txt)
 do
    echo "$name"
 done

cat name.txt    //查看文件内容,只有3行
bash fen1.sh    //运行脚本,显示5行内容

变量IFS定义的分隔符中有空格,for从文件中获取变量值时,以空格作为了分隔符,将"zhang san"分隔成了两行,"wang wu"也是如此。

在脚本中,先临时将变量IFS的值中的空格删除,使for语句不以空格作为分隔符,最后还原变量值。
vim fen2.sh       //写脚本
 #!/bin/bash
 ​
 #借用一个临时变量先保存IFS的原始值
 IFS_OLD=$IFS
 #删除空格和制表符,只保留换行符作为分隔符
 IFS=$'\n'
 ​
 #从文件中获取变量值,$()表示调用命令执行的结果
 for name in $(cat name.txt)
 do
    echo "$name"
 done
 ​
 #还原变量IFS的原始值
 IFS=$IFS_OLD


 while循环应用示例
批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、stu2、...... 、stu20
初始密码均设为123456

vim while01.sh    //创建脚本
 #!/bin/bash
 #用户名称以stu开头,按数字顺序进行编号
 #一共添加20个用户,即stu1、stu2、...... 、stu20
 #初始密码均设为123456
 ​
 a=1
 while [ $a -le 20 ]
 do
    useradd stu$a -M
    echo "123456"| passwd --stdin stu$a &>/dev/dull
    let a++
    #一定要有变量迭代的过程
 done


猜商品价格游戏

vim while02.sh         //创建脚本
 #!/bin/bash
 # 猜商品价格游戏
 # 通过变量RANDOM获得随机数
 # 提示用户猜测并记录次数,猜中后退出循环
 #-----------------------------------------
 #商品价格
 price=$[RANDOM%100+1]
 #猜的次数
 a=0
 ​
 #死循环,一直为真。需要人为设置退出。
 while true
 do
    read -p "请猜测商品价格(1-100):" num
    let a++
    if [ $num -eq $price ]
    then
         echo "恭喜你猜对了"
         echo "你一共猜了 $a 次"
         exit
         #猜对价格后,退出脚本进程
     elif [ $num -lt $price ]
     then
          echo "太低了"
     else [ $num -gt $price ]
           echo "太高了"
      fi
 done


while和read结合 读取文件内容

read 每次只能读取一行内容,如果read识别到了换行符,就结束这一次的读取。
linux中的换行符是:换行+回车( 即“\n” )

把test文件重定向输入给while,之后read逐行读取
while read line
 do
    echo $line
 done < test.txt

把文件内容通过管道符传给while,之后read逐行读取
 #!/bin/bash
 #把文件内容通过管道符传给while,之后read逐行读取
 ​
 cat test.txt | while read line
 do
      echo $line
 done 

until循环语句
重复测试某个条件,只要条件不成立则反复执行。
格式:
 vim until01.sh        //写脚本
 #!/bin/bash
 # 计算1到10的和
 ​
 sum=0
 i=1
 # 条件不成立才执行命令序列
 until [ $i -gt 10 ]
 do
    let sum=$[sum+i]
    let i++
 done
 echo "1到10的求和结果是:$sum"
 ​
为指定用户发送在线消息

为指定用户发送在线消息;
若用户不在线(未登录系统),则每10分钟试一次,直至用户登录系统后再发送消息;
用户名与消息通过位置参数传递给脚本。
vim until02.sh
 #!/bin/bash
 #为指定用户发送在线消息
 #若用户不在线(未登录系统),则每10分钟试一次,直至用户
 登录系统后再发送消息
 #用户名与消息通过位置参数传递给脚本
 ​
 # 只要用户在线不成立(即用户不在线).就执行命令序列
 until who |grep "$1" &> /dev/null
 do
    echo "$1 不在线"
    sleep 600
 done
 echo $2 | write $1

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

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

相关文章

nodejs+vue文旅门户信息网站 elementui旅游项目推荐系统 景点门票预订网站vscode

在社会快速发展的影响下&#xff0c;服务行业继续发展&#xff0c;随着旅游的人数不断增加&#xff0c;使哈尔滨旅游项目推荐平台的管理和运营比过去十年更加信息化&#xff0c;依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上哈尔滨旅游项目推荐平台是一项十分重要…

day73【代码随想录】二刷链表

文章目录前言一、环形链表||&#xff08;力扣142&#xff09;二、寻找重复数&#xff08;力扣287&#xff09;三、缺失的第一个正数&#xff08;力扣41&#xff09;每日一题day73&#xff1a;等差子数组&#xff08;力扣1630&#xff09;前言 1、等差子数组 2、寻找重复数 3、…

ThreeJS-纹理(十)

关键代码&#xff1a; const textureLoader new THREE.TextureLoader(); //纹理加载器加载图片 const docColorLoader textureLoader.load(static/1.webp) // let color new THREE.Color(Math.random(), Math.random(), Math.random()); const cubeMaterial new THREE.Mesh…

法规标准-GB/T 39901标准解读(2021版)

GB/T 39901是做什么的&#xff1f; GB/T 39901全名为乘用车自动紧急制动系统(AEBS)性能要求及试验方法&#xff0c;其中主要对AEBS的功能要求、性能要求及测试要求进行介绍 一般要求 1.安装有自动紧急制动系统的车辆应安装符合GB 21670-2008要求的防抱制动系统 2.AEBS的电磁…

近世代数 笔记和题型连载 第七章(阿贝尔群和循环群)

文章目录基础概念1.阿贝尔群2.循环群3.有限循环群4.元素的阶5.无限循环群相关题型1.判断一个代数系统的代数结构2.判定一个群是否是循环群3.判定一个群是否是循环群4.循环群的生成元有关问题5.判定元素的阶6.判定元素的阶7.判定元素的阶8.求给定循环群的所有子群9.求给定循环群…

七. MySQL 其它优化相关

目录一. 数据库问题排查流程二. 表连接驱动表与被驱动表Nested Loop Join 与小表驱动大表JoinBuffer 连接缓冲区Index Nested-Loop Join 索引嵌套循环连接Batched Key Access join 批量的key访问连接Block Nested-Loop Join 缓存块嵌套循环连接三. 半连接in 与 existssemi-join…

Vue 04 - Vue模板语法

目录 介绍 Mustache 插值语法 Attribute指令语法 代码演示 运行效果 介绍 Vue.js 使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML&#xff0c;所以能被遵循规范的浏览器和 HTML 解析器解…

PCB模块化设计10——PCI-E高速PCB布局布线设计规范

目录PCB模块化设计10——PCI-E高速PCB布局布线设计规范1、PCI-E管脚定义2、PCI-E叠层和参考平面3、 PCB设计指南1、阻抗要求2、线宽线距3、长度匹配4、走线弯曲角度5、测试点、过孔、焊盘6、AC去耦电容放置方法7、金手指和连接器的注意事项8、其他的注意事项PCB模块化设计10——…

STM32学习笔记(一)基础知识

文章目录一、什么是单片机&#xff1f;二、STM系列单片机命名规则三、STM32F103C8T6单片机简介四、标准库与HAL库区别五、通用输入输出端口GPIO六、复位和时钟控制&#xff08;RCC&#xff09;七、时钟八、中断和事件九、定时器一、什么是单片机&#xff1f; 单片机和PC电脑相比…

SpringBoot的多环境配置详解(上)——文件配置项版

SpringBoot不同环境加载不同配置文件 - resource & profile 文章目录SpringBoot不同环境加载不同配置文件 - resource & profile1、 profile多配置文件2、 profile单配置文件3、maven的profiles策略4、spring.profiles.activeprofiles.active用法1、 profile多配置文件…

健身房训练计划—背部

杠铃屈腿硬拉&#xff08;臀&#xff0c;大腿&#xff09; 动作要领&#xff1a; 1&#xff0c;站距和肩等宽&#xff0c;脚尖微微外八&#xff0c;拉的时候把杆贴近小腿&#xff0c;身体成45度&#xff08;头背腰成45度&#xff09;。 2&#xff0c;发力的时候腿用力向上蹬&am…

IOC 相关内容

IOC 相关内容4&#xff0c;IOC相关内容4.1 bean基础配置4.1.1 bean基础配置(id与class)4.1.2 bean的name属性步骤1&#xff1a;配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序4.1.3 bean作用范围scope配置4.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现4.1.3.…

三个月从功能测试进阶到自动化测试,涨薪5k?你在想啥呢?

一、自动化测试要学多久能学会&#xff1f; 兄弟&#xff0c;老实说如果你现在上班&#xff0c;之前主要在做功能测试&#xff0c;或者编程基础比较弱的话&#xff0c;三个月够呛。 如果你是脱产学习&#xff0c;每天能保持6&#xff5e;8小时学习时间的话&#xff0c;可以。…

【综】A review of bicycle-sharing service planning problems

A review of bicycle-sharing service planning problems 共享单车服务规划问题综述 article{ZHOU2022608, title {Review of bike-sharing system studies using bibliometrics method}, journal {Journal of Traffic and Transportation Engineering (English Edition)}, v…

12.0 自定义SystemUI下拉状态栏和通知栏视图(十九)之悬浮通知布局

1.前言 在进行12.0的系统rom产品定制化开发中,在12.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删…

是面试官放水,还是企业实在是缺人?这都没挂,字节原来这么容易进...

“字节是大企业&#xff0c;是不是很难进去啊&#xff1f;”“在字节做软件测试&#xff0c;能得到很好的发展吗&#xff1f;一进去就有9.5K&#xff0c;其实也没有想的那么难”直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾讯…

基于springboot学生信息管理系统

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

JAVA ---数据类型

&#xff08;一&#xff09;Java的标识符与关键字 现实世界&#xff0c;所有东西都有属于自己的名字&#xff0c;从而方便分类和区别其他事物。在程序中&#xff0c;常常用一个记号对变量、数组、方法和类等进行标识&#xff0c;这个记号就叫标识符&#xff08;名字&#xff09…

华为OD机试用java实现 -【最优调度策略】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:最优调度策略 题目 在通信系…

JavaScript核心高级内容复习3

文章目录对象的创建模式继承模式详细介绍Object构造函数模式对象字面量工厂模式自定义构造函数模式构造函数原型的组合模式继承模式--原型链继承继承模式--借用构造函数继承继承模式--组合继承对象的创建模式 Object构造函数模式var obj {}; obj.name Tom obj.setName func…
推荐文章