您现在的位置是:网站首页> 编程资料编程资料

linux shell循环:for、while、until用法详解_linux shell_

2023-05-26 374人已围观

简介 linux shell循环:for、while、until用法详解_linux shell_

学习脚本就是为了方便我们运维工作,而对运维人员从来讲,有很多工作也是需要重复执行的,比如我们管理用户帐户时就需要批量创建和删除用户帐户。而此时如果使用系统自带的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[0m\c" echo -e "\e[34m♥\e[0m\c" 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 "\033[3"$we";5m♥\033[0m\c" #红色加闪烁 done echo done

添加10个用户user1-user10,密码为8位随机字符、

 #!/bin/bash > /root/user.log for i in {1..10};do useradd user$i && echo user$i is created pass=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 16) #生成随机数 echo user$i:---pass:$pass >> /root/user.log echo $pass |password --stdin user$i &> /dev/null done

/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start

 #!/bin/bash for i in $(ls /etc/rc.d/rc3.d/);do #查看文件内容确定循环次数 if [[ $i =~ ^K.* ]];then echo "$i stop" elif [[ $i =~ ^S.* ]];then echo "$i start" fi done [root@centos6mini app]# ./linshi K05wdaemon stop K10saslauthd stop K15htcacheclean stop K15httpd stop K30spice-vdagentd stop K50dnsmasq stop K50kdump stop K73winbind stop K74ntpd stop ...省略...

编写脚本,提示输入正整数n的值,计算1+2+…+n的总和

 #!/bin/bash read -p "请输入一个正整数" s w=0 if [[ "$s" =~ ^[0-9]+$ ]] ;then for i in $(seq 1 $s) ;do w=$[$w+$i] done echo "整数1到$s的和为$w" else echo "请输入正整数" fi

计算100以内所有能被3整除的整数之和

方法一:

[root@centos6mini app]# echo {3..100..3} |tr " " "+"|bc #进行步进,替换相加
1683

方法二:

 #!/bin/bash for i in {3..100..3};do #步进,相加 n=$[$n+$i] &> /devnull done echo $n

方法三:

 #!/bin/bash sum=0 for n in $(seq 1 100);do i=$[$n/3] #进行相除 y=$[3*$i] #进行相乘 、运算成功则成立 if [ $y -eq $n ];then sum=$[$n+$sum] fi done echo $sum

方法四:

 sum=0 for i in {1..100};do if [ $[$i%3] -eq 0 ];then #相除取余进行判定 let sum+=$i #进行加法运算 fi done echo $sum

打印九九乘法表

 for (( i=1 ;i<=9;i++ ));do for ((n=1;n<=9;n++)) ;do w=0 w=$[$n*$i] if [ $n -le $i ];then echo -n " $i*$n=$w " fi done echo done

在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html

方法一:

 #!/bin/bash cd /testdir &> /dev/null if [ ! $(echo $?) -eq 0 ] ;then #判断文件是否存在 mkdir /testdir &> /dev/null fi for i in $(seq 1 10 );do w=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 8) touch $i$w.html done

方法二:

 if ! [ -d /testdir ];then #判断文件是否存在 mkdir /testdir &> /dev/null #如果没有创建文件 fi for i in {1..10};do touch /testdir/$i`cat /dev/urandom |tr -dc [:alpha:] |head -c 8`.html #创建文件 done

探测局域网内的主机

172.18.250-254.X

能ping通显示并保存至/root/ip.log

要求并行探测提高效率。

 [root@centos6mini zuoye]# cat 11.sh #!/bin/bash > /root/ip.log for i in {250
                
                

-六神源码网