本文主要讲解Shell脚本开发中for和select循环的知识与实践
目录:
1.for循环语法结构
2.for循环语句的基础实践
3.for循环语句的企业级案例
4.linux系统产生随机数的四种方法
5.select循环语句介绍及语法
6.select循环语句案例
一:for循环语法结构
第一种for循环语句为变量取值型,语法结构如下:
for 变量名 in 变量取值列表do 指令...done
在这种for循环语句语法中,for关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),每次仅取一个,然后进入循环(do和done之间的部分)执行循环内的所有指令,当执行到done时结束本次循环。之后,“变量名”再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,当执行到done时结束返回,以此类推,知道取完变量列表里的最后一个值并进入循环执行到done结束为止。
第二种for循环语句称为C语言型for循环语句,其语法结构如下:
for ((expr1;expr2;expr3))do 指令...done
二:for循环语句的基础实践
范例1:竖向打印4、3、2、1这4个数字
[root@aliyun for]# cat test.sh #!/bin/bash#法1for n in 4 3 2 1do echo $ndone#法2for n in {4..1}do echo $ndone#法3for n in `seq 4 -1 1`do echo $ndone
范例2:用for循环批量修改文件扩展名(把txt改成jpg)
[root@aliyun for]# mkdir test[root@aliyun for]# touch test/{1.txt,2.txt,ywxi.txt}[root@aliyun test]# ls1.txt 2.txt ywxi.txt[root@aliyun test]# cat gm.sh #!/bin/bashcd /scripts/practice/for/testfor filename in `ls|grep "txt$"`do mv $filename `echo $filename|cut -d . -f1`.jpgdone[root@aliyun test]# sh gm.sh [root@aliyun test]# ls1.jpg 2.jpg gm.sh ywxi.jpg#法二:[root@aliyun test]# rename "jpg" "txt" *.jpg[root@aliyun test]# ls1.txt 2.txt gm.sh ywxi.txt
三:for循环语句的企业级案例
范例:批量创建5个系统账号(dan01~dan05),并设置密码(密码为随机数,要求是字符和数字的混合)
1.给一个数字加0有多种实现方法[root@aliyun ~]# seq -w 050102030405[root@aliyun ~]# echo {01..05}01 02 03 04 05 2.要想通过脚本创建账号,必须知道如何实现无交互设置密码。如下:[root@aliyun home]# useradd dan[root@aliyun home]# echo 123456|passwd --stdin danChanging password for user dan.passwd: all authentication tokens updated successfully.3.密码为随机数,要求是字符和数字等的混合,方法如下:[root@aliyun home]# echo $RANDOM16781[root@aliyun home]# echo $RANDOM|md5sum 1915bea3b67365818bfd16026dbc4807 -[root@aliyun home]# echo $RANDOM|md5sum |cut -c 1-8bfcf62b64.脚本示范:[root@aliyun scripts]# cat forsz.sh [root@aliyun for]# cat forsz.sh #!/bin/bash#Author:ywxi. /etc/init.d/functionsuser="dan"passfile="/tmp/user.log"for num in `seq -w 01 05`do pass="`echo "dan$RANDOM"|md5sum|cut -c 1-8`" useradd $user$num &>/dev/null &&\ echo "$pass"|passwd --stdin $user$num &>/dev/null &&\ echo -e "user:$user$num\tpasswd:$pass" >> $passfile if [ $? -eq 0 ] then action "$user$num is ok" /bin/true else action "$user$num is fail" /bin/false fidoneecho ------------------cat $passfile && >$passfile 5.脚本测试[root@aliyun for]# sh forsz.sh dan01 is ok [ OK ]dan02 is ok [ OK ]dan03 is ok [ OK ]dan04 is ok [ OK ]dan05 is ok [ OK ]------------------user:dan01 passwd:0f1b6c1fuser:dan02 passwd:49a2d4f1user:dan03 passwd:a07927fduser:dan04 passwd:93c52f69user:dan05 passwd:76a2dd17
四:linux系统产生随机数的四种方法
法1:通过系统环境变量$RANDOM实现
[root@aliyun for]# echo $RANDOM80[root@aliyun for]# echo "ywxi$RANDOM"|md5sum |cut -c 1-98c1b842d2
法2:通过openssl产生随机数,如下:
[root@aliyun for]# openssl rand -base64 8P49T7OjQzx4=[root@aliyun for]# openssl rand -base64 803NL6BL2H0Tf/QyRxn82Huf0c+/nRUu3gauTUtk0Vw1v//+gErSf30TE9mgTmrzAZ9Jm6I0WVFhrdc/clsZALzSXL2YVDcEESjZR6dGXGtzQ=
法3:通过实践(date)获得随机数,如下:
[root@aliyun for]# date +%s%N1528417843434360448[root@aliyun for]# date +%s%N1528417844647613752
法4:使用expect附带的mkpasswd生成随机数
[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1 y1tu4E+KY[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 16nyF{1kXJ[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1o8^l1ZhIW[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1|md5sum |cut -c 2-10130a98842[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1|md5sum |cut -c 2-10c607f47d6
五:select循环语句介绍及语法
select语法结构如下:
select 变量名 [ in 菜单取值列表 ]do 指令...done
select循环语句的主要作用可能就是创建菜单,在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。与for循环不同的是,select循环执行后出现菜单项等待用户选择(不会自动循环所有变量列表),而用户输入的只能是菜单项前面的数字序号,每输入一次对应的序号就会执行一次循环,直到变量后面对应列表取完为止。
六:select循环语句案例
范例::用select循环打印简单菜单项的多种实现方法
法1:[root@aliyun select]# cat select1.sh #!/bin/bashselect name in ywxi ywxi2 ywxi3do echo $namedone法2:[root@aliyun select]# cat select2.sh #!/bin/basharr=(ywxi ywxi2 ywxi3)select name in "${arr[@]}"do echo $namedone法3:[root@aliyun select]# cat select3.sh #!/bin/bash#Author:ywxiselect name in `ls /tmp/test`do echo $namedone执行结果如下:[root@aliyun select]# sh select3.sh 1) ywxi2) ywxi23) ywxi3#? 1ywxi#? 2ywxi2#? 3ywxi3