本文主要讲解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