本文主要讲解 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
来源: http://www.bubuko.com/infodetail-2635946.html