本文主要讲解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
#法1
for n in 4 3 2 1
do
    echo $n
done

#法2
for n in {4..1}
do
    echo $n
done

#法3
for n in `seq 4 -1 1`
do
    echo $n
done


范例2:用for循环批量修改文件扩展名(把txt改成jpg)

[root@aliyun for]# mkdir test
[root@aliyun for]# touch test/{1.txt,2.txt,ywxi.txt}
[root@aliyun test]# ls
1.txt  2.txt  ywxi.txt
[root@aliyun test]# cat gm.sh 
#!/bin/bash
cd /scripts/practice/for/test
for filename in `ls|grep "txt$"`
do
    mv $filename `echo $filename|cut -d . -f1`.jpg
done
[root@aliyun test]# sh gm.sh 
[root@aliyun test]# ls
1.jpg  2.jpg  gm.sh  ywxi.jpg

#法二:
[root@aliyun test]# rename "jpg" "txt" *.jpg
[root@aliyun test]# ls
1.txt  2.txt  gm.sh  ywxi.txt




三:for循环语句的企业级案例

范例:批量创建5个系统账号(dan01~dan05),并设置密码(密码为随机数,要求是字符和数字的混合)

1.给一个数字加0有多种实现方法
[root@aliyun ~]# seq -w 05
01
02
03
04
05
[root@aliyun ~]# echo {01..05}
01 02 03 04 05 

2.要想通过脚本创建账号,必须知道如何实现无交互设置密码。如下:
[root@aliyun home]# useradd dan
[root@aliyun home]# echo 123456|passwd --stdin dan
Changing password for user dan.
passwd: all authentication tokens updated successfully.

3.密码为随机数,要求是字符和数字等的混合,方法如下:
[root@aliyun home]# echo $RANDOM
16781
[root@aliyun home]# echo $RANDOM|md5sum 
1915bea3b67365818bfd16026dbc4807  -
[root@aliyun home]# echo $RANDOM|md5sum |cut -c 1-8
bfcf62b6

4.脚本示范:
[root@aliyun scripts]# cat forsz.sh 
[root@aliyun for]# cat forsz.sh 
#!/bin/bash
#Author:ywxi
. /etc/init.d/functions
user="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
    fi
done
echo ------------------
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:0f1b6c1f
user:dan02      passwd:49a2d4f1
user:dan03      passwd:a07927fd
user:dan04      passwd:93c52f69
user:dan05      passwd:76a2dd17




四:linux系统产生随机数的四种方法

法1:通过系统环境变量$RANDOM实现

[root@aliyun for]# echo $RANDOM
80
[root@aliyun for]# echo "ywxi$RANDOM"|md5sum |cut -c 1-9
8c1b842d2


法2:通过openssl产生随机数,如下:

[root@aliyun for]# openssl rand -base64 8
P49T7OjQzx4=
[root@aliyun for]# openssl rand -base64 80
3NL6BL2H0Tf/QyRxn82Huf0c+/nRUu3gauTUtk0Vw1v//+gErSf30TE9mgTmrzAZ
9Jm6I0WVFhrdc/clsZALzSXL2YVDcEESjZR6dGXGtzQ=


法3:通过实践(date)获得随机数,如下:

[root@aliyun for]# date +%s%N
1528417843434360448
[root@aliyun for]# date +%s%N
1528417844647613752


法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 1
6nyF{1kXJ
[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
o8^l1ZhIW
[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1|md5sum |cut -c 2-10
130a98842
[root@aliyun for]# mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1|md5sum |cut -c 2-10
c607f47d6




五:select循环语句介绍及语法

select语法结构如下:

select  变量名  [ in 菜单取值列表 ]
do
    指令...
done

  select循环语句的主要作用可能就是创建菜单,在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。与for循环不同的是,select循环执行后出现菜单项等待用户选择(不会自动循环所有变量列表),而用户输入的只能是菜单项前面的数字序号,每输入一次对应的序号就会执行一次循环,直到变量后面对应列表取完为止。




六:select循环语句案例

范例::用select循环打印简单菜单项的多种实现方法

法1:
[root@aliyun select]# cat select1.sh 
#!/bin/bash
select name in ywxi ywxi2 ywxi3
do
    echo $name
done

法2:
[root@aliyun select]# cat select2.sh 
#!/bin/bash
arr=(ywxi ywxi2 ywxi3)
select name in "${arr[@]}"
do
    echo $name
done

法3:
[root@aliyun select]# cat select3.sh 
#!/bin/bash
#Author:ywxi
select name in `ls /tmp/test`
do
    echo $name
done

执行结果如下:
[root@aliyun select]# sh select3.sh  
1) ywxi
2) ywxi2
3) ywxi3
#? 1
ywxi
#? 2
ywxi2
#? 3
ywxi3