shell编程 循环语句

181 阅读2分钟

for循环

image.png

image.png

for语句实例:

20220825154517.png

image.png

20220825155232.png

image.png

20220825112620.png

for示例1:添加用户,存放在users.txt,判断用户是否存在,存在则不添加,密码为123456

20220825161309.png

20220825160949.png

20220825162805.png

20220825161147.png

for示例2:根据IP地址检查主机状态,IP地址存放在ipadds.txt中,ping命令检测

20220825164034.png

20220825164734.png

20220825164848.png

while循环

while [ 条件测试操作 ]

do #do代表循环的开始

判断式/命令序列

done #done代表循环的结束

image.png

while实例

20220825165632.png

72d93d05800540b34fad095fd4eecb1.png

while示例1:添加用户以stu开头,按数字编号,密码为123456

20220825171853.png

20220825171429.png

while示例2:通过变量random获得随机数,猜测并记录,猜中退出循环

20220825180046.png

20220825175902.png

until循环语句

20220825190227.png

20220825192832.png

until实例:

20220825193836.png

20220825193454.png

until应用示例

20220825194341.png

until示例1:计算1——50的和

20220825195243.png

20220825195301.png

补充:

b51ed22a3b5d5539bb61a77c6aa8c46.png

关于echo的用法:

set -x 可以查看代码执行过程

echo -n表示不换行输出

echo -e输出转义字符,将转义后的内容输出到屏幕上

常用的转义字符如下:

\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。

\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n;但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

\n换行,被输出的字符从"\n"处开始另起一行。

\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;

\v 与\f相同;

\t 转以后表示插入tab,即横向制表符;

\r 光标移至行首,但不换行,相当于使用“\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存 在任何字符时,"\r"前面的字符不会被覆盖

\表示插入""本身;

截取字符串 分片 ${ 变量名:下标 : 长度 }

字符串长度 ${#变量名}

i='echo "11,22,33,44"'

echo ${i%,*}

11,22,33

//从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除

echo ${i%%,*}

11

//从最后倒数到最长的匹配部分(用%%)后面的逗号的地方都被删除

echo ${i#*,}

22,33,44

//从开头到最短的匹配部分(用#)后面的逗号的地方被删除

echo ${i##*,}

44

//从开头到最长的匹配部分(用##)后面的逗号的地方被删除

20220829160641.png

20220829160846.png

IFS字段分隔符

默认包含空格,制换符,换行符 可以使用set | grep IFS查看

IFS=$'\n'

修改成只换行

IFS=$' \n'

IFS=:

IFS=','

IFS.OLD=$IFS

IFS=$ '\n'

...

IFS=$IFS.OLD

while read line

---line 为变量名

do

...

done < file

l while read line

do

...

done

练习:输出环境变量PATH的目录所包含的所有可执行文件

20220829155111.png

20220829155657.png

20220829155754.png

例题:编写能够自动生成一个8位随机密码的脚本

20220829180916.png

20220829173623.png

例题:假设/opt/test/ 目录中有多个重要文件,编写脚本使用 md5sum 命令一次性判别目录中的文件是否有发生过改动

20220829180346.png