shell编程之循环语句 for (包看包会 如果不会 再看一遍)(下)

简介: 1 什么是循环凡是重复执行一段代码, 都可以称之为循环。 循环体中三种专业的话术:遍历、迭代、递归 。遍历(traversal) - 按规则访问非线性结构中的每一项。迭代(iterate) - 按顺序访问线性结构中的每一项。递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况。

示例4:生成8位随机密码(使用字符串分片的方法)

实验要求:生成8位随机密码,密码范围为26个大小写英文字母和10个阿拉伯数字。

实验思路:

  1. 先定义密码取值范围:26个大小写英文字母和10个阿拉伯数字
  2. 每次取1个字符。
  3. 循环取8次。

实验步骤:

1、字符串分片(截取字符串)

#获取字符串长度
 ${#变量名}
 #字符串下标值
 字符串内下标值从0开始,0到字符串长度减1。
 如果字符串长度为8,那么下标值就是 0到7。
 #截取字符串
 ${变量名:开始的下标值:截取长度}
 #字符串追加
 变量一+=变量二
 # 示例:
 i="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 字符串长度:${#i}          //此时长度为62
 字符串下标值:0-61
 截取第一个字符:${i:0:1}  
 截取前三个字符:${i:0:3}
 截取最后一个字符:${i:61:1}
复制代码


2、生成随机数

#变量RANDOM的取值范围是:0-32767
 #生成 0-61 之间的随机数
 $[RANDOM % 62]
 #生成符串长度以内的随机数(即 0-字符串长度减1)
 $[RANDOM % ${#i}]
 #随机截取字符串内任意一个字符
 num=$[RANDOM % ${#i}]      //生成字符串长度以内的随机数
 var=${i:$num:1}            //随机截取字符串内任意一个字符
复制代码


3、示例代码

[root@yuji ~]# vim passran.sh
 #!/bin/bash
 # 要求生成8位随机密码,密码范围为26个大小写英文字母和10个阿拉伯数字。
 # ---------------------
 #定义密码取值范围
 string="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 #循环8次
 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"
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


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

普通for循环是串行,一个一个执行。

在do和done中间增加 { } 符号,可以多线程同时执行。

多线程案例演示:

  • ping 192.168.72.0/24网段内的所有主机。
[root@yuji ~]# 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的作用是等待上面所有后台进程都执行完毕后,才会去执行后
 面的语句。如果没有wait,后面的语句是不会等待后台进程的,会>造成一些需要有上下文关系的程序执行错误。
 wait
 cat /opt/up.txt
 cat /opt/down.txt
复制代码


网络异常,图片无法展示
|


4 for的三个默认分隔符

环境变量$IFS,是指内部字段分隔符, 默认为三个:空格、制表符 \t、换行符 \n。

使用set命令查看所有变量:

网络异常,图片无法展示
|


4.1 分隔符的作用演示:

示例:使用for读取文件内容,文件中有空格

演示:

文件中只有3行内容,使用for语句读取却显示为5行。

[root@yuji sh]# vim fen1.sh     //写脚本
 #!/bin/bash
 #从文件中获取变量值,$()表示调用命令执行的结果
 for name in $(cat name.txt)
 do
    echo "$name"
 done
 [root@yuji sh]# cat name.txt    //查看文件内容,只有3行
 zhang san
 lisi
 wang wu
 [root@yuji sh]# bash fen1.sh    //运行脚本,显示5行内容
 zhang
 san
 lisi
 wang
 wu
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


原因:

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

解决方法:

在脚本中,先临时将变量IFS的值中的空格删除,使for语句不以空格作为分隔符,最后还原变量值。

[root@yuji sh]# 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
 [root@yuji sh]# cat name.txt    //查看文件内容,只有3行
 zhang san
 lisi
 wang wu
 [root@yuji sh]# bash fen2.sh     //运行脚本,显示3行
 zhang san
 lisi
 wang wu
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|

相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
107 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
46 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
79 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
49 12
|
3月前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
55 5