linux shell循环:for、while、until用法详解
学习脚本就是为了方便我们运维工作,而对运维人员从来讲,有很多工作也是需要重复执行的,比如我们管理用户帐户时就需要批量创建和删除用户帐户。而此时如果使用系统自带的useradd或者userdel去操作的话,就只能机械式的一个一个创建,一个一个的删除。那我们是不是就可以考虑写一个程序,让它自动化的去创建了。此时,我们的循环执行概念也就出来了。循环就是让程序按照一定的条件反复的执行相关操作,直到不在满足循环条件时结束。
循环语句常见分类:
1,for语句
2,while语句
3,until语句
循环体包括两部分:
1,循环的进入条件
2,循环的退出条件
循环次数:
1,事先已知 for语句
2,事先未知 while、until语句
for循环常见语法格式:
for 变量名 in 列表;do
循环体
done
循环执行机制:依次将列表中的元素赋值给变量名,每次赋值后执行一次循环体,直到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end} 如:{1..10}
(b) $(seq [start [step]] end) 如:`seq 1 2 100` 表示1-100之间的所有奇数
(3) 返回列表的命令 $(COMMAND) 如:`ls /etc`
(4) 使用glob,如:*.sh
(5) 变量引用;$@, $*
for循环特殊用法:
双小括号方法,即((…))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作
#I=10
#((I++))
for循环特殊用法格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断for循环应用实例:
1,计算1-100之间所有正整数的和
#!/bin/bash #Author:wangjun #Contact QQ:183530300 #Version:1.0 #Create time:2016-08-17 16:53:28 #Description:1-100 all positive integer's sum declare -i sum=0 for I in {1..100};do let sum+=$I done echo "1-100 all positive integer's sum : $sum"
2,自动扫描1-254网段的所有主机,统计在线主机数与不在线主机数
#!/bin/bash #Author:wangjun #Contact QQ:183530300 #Version:1.0 #Create time:2016-08-17 11:25:37 #Description:ping all hosts and count the number declare -i online=0 declare -i offline=0 declare -i host=1 for host in `seq 254`;do ping -c 1 -W 1 10.1.250.$host &> /dev/null && echo "10.1.250.$host is online" && let online=$online+1 || let offline++ done echo "Online hosts number : $online" echo "Offline hosts number : $offline"
3,生成10个随机数,并找出最大随机数和最小随机数
#!/bin/bash #Author:wangjun #Contact QQ:183530300 #Version:1.0 #Create time:2016-08-17 17:27:45 #Description:random number comparative minrandom=$RANDOM maxrandom=$minrandom echo $minrandom for I in {1..9};do RD=$RANDOM echo $RD if [[ $RD -gt $maxrandom ]];then maxrandom=$RD elif [[ $RD -lt $minrandom ]];then minrandom=$RD fi done echo "Minrandom is : $minrandom" echo "Maxrandom is : $maxrandom"
4,打印九九乘法表(第一版)
#!/bin/bash #Author:wangjun #Contact QQ:18353030 #Version:1.0 #Create time:2016-08-16 13:07:40 #Description:99 multiplication table for Row in {1..9};do for Column in `seq $Row`;do echo -ne "${Column}x${Row}=$[$Row*$Column]t" done echo done
5,打印九九乘法表(第二版)——for循环特殊用法
#!/bin/bash #Author:wangjun #Contact QQ:183530300 #Version:1.0 #Create time:2016-08-18 11:35:16 #Description:multiplication table for ((row=1;row<=9;row++));do for ((column=1;column<=$row;column++));do echo -ne "${column}x${row}=$[${column}*${row}]t" done echo done
循环执行 :将某代码段重复运行多次; 重复运行多少次: 循环次数事先已知 ;循环次数事先未知 ;有进入条件和退出条件。
三种循环体:for、while、until。
再循环前前介绍步进,在循环中经常用到步进。
步进
显示1-10
[root@centos6mini app]# echo {1..10} 1 2 3 4 5 6 7 8 9 10 [root@centos6mini app]# echo $(seq 1 10) 1 2 3 4 5 6 7 8 9 10
1-10 递加
[root@centos6mini app]# echo {1..10..2}
1 3 5 7 9
[root@centos6mini app]# echo $(seq 1 2 10)
1 3 5 7 9
1-10 递减
[root@centos6mini app]# echo {10..1..2}
10 8 6 4 2
[root@centos6mini app]# echo $(seq 10 -2 1)
10 8 6 4 2
1-100间的奇数和偶数
[root@centos6mini app]# echo {1..100..2}
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
[root@centos6mini app]# echo {2..100..2}
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
[root@centos6mini app]# echo {100..1..2}
100 98 96 94 92 90 88 86 84 82 80 78 76 74 72 70 68 66 64 62 60 58 56 54 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 4 2
[root@centos6mini app]# echo {99..1..2}
99 97 95 93 91 89 87 85 83 81 79 77 75 73 71 69 67 65 63 61 59 57 55 53 51 49 47 45 43 41 39 37 35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1
随机生成16位包含数字、大小写字母、符号的密码
cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 16
tr -d 和 tr -dc 的用法
[root@centos6mini app]# echo 12324345 |tr -d 2 #不要数字2
134345
[root@centos6mini app]# echo 12324345 |tr -dc 2 #支取数字2
22
for循环
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执 行一次循环体; 直到列表中的元素耗尽,循环结束
for循环的列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令 $(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用; $@, $*
批量创建user1至user10,要求设置随机16位密码,包含数字、大小写字母、符号。并要求用户使用密码首次登录后,强制设置新密码。
#!/bin/bash > /root/user.log for i in {1..10};do #创建十个用户 useradd user$i && echo user$i is created #随机生成密码 password=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 16) #将用户和密码导出 echo user$i:$password >> /root/user.log #设置密码 echo $password |passwd --stdin user$i &> /dev/null #强制下次登录修改密码 passwd -e user$i &> /dev/null done
使用♥,利用for,显示出一个等腰三角形。
方法一:
for ((i=1;i<10;i++)) do for ((j=1;j<=i;j++)) do echo -n "♥" done echo done for ((i=1;i<9;i++)) do for ((j=9;j>i;j--)) do echo -n "♥" done echo done ♥ ♥♥ ♥♥♥ ♥♥♥♥ ♥♥♥♥♥ ♥♥♥♥♥♥ ♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥♥ ♥♥♥♥♥♥♥ ♥♥♥♥♥♥ ♥♥♥♥♥ ♥♥♥♥ ♥♥♥ ♥♥ ♥
方法二:
#!/bin/bash2 read -p "请输入三角形的高度: " num for i in `seq $num`;do for x in `seq 1 $[$num-$i]`;do echo -e " c" done for n in `seq 1 $[2*$i-1]`;do #yanse=`tr -dc '1-6' < /dev/urandom | head -c 1` #echo -e "e[3"$yanse"m♥e[0mc" echo -e "e[34m♥e[0mc" done echo done ♥ ♥♥♥ ♥♥♥♥♥ ♥♥♥♥♥♥♥
方法三:
#!/bin/bash for ((i = 1; i < 10; i++)) do for ((j = 10; j > i; j--)) do echo -n " "; done for ((m = 1; m <= i; m++)) do echo -n "$i " done echo "" done [root@centos7 ~]# ./sjx 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9
方法四:
#!/bin/bash #彩色闪烁山角形 read -p "请输入三角形边长: " w for (( i=1;i<=$w;i++ )); do for(( j=$w;j>$i;j-- ));do echo -n " " done for (( m=1;m<=i;m++ ));do we=`cat /dev/urandom |tr -dc '1-6' |head -c 1 ` echo -e " 33[3"$we";5m♥