麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Linux Shell > 正文

linux shell循環:for、while、until用法詳解

2020-07-27 18:45:14
字體:
來源:轉載
供稿:網友

學習腳本就是為了方便我們運維工作,而對運維人員從來講,有很多工作也是需要重復執行的,比如我們管理用戶帳戶時就需要批量創建和刪除用戶帳戶。而此時如果使用系統自帶的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 sumdeclare -i sum=0for I in {1..100};do let sum+=$Idoneecho "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 numberdeclare -i online=0declare -i offline=0declare -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++doneecho "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 comparativeminrandom=$RANDOMmaxrandom=$minrandomecho $minrandomfor I in {1..9};do RD=$RANDOM echo $RD if [[ $RD -gt $maxrandom ]];then  maxrandom=$RD elif [[ $RD -lt $minrandom ]];then  minrandom=$RD fidoneecho "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 tablefor Row in {1..9};do for Column in `seq $Row`;do  echo -ne "${Column}x${Row}=$[$Row*$Column]/t" done echodone

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 echodone

循環執行 :將某代碼段重復運行多次; 重復運行多少次: 循環次數事先已知 ;循環次數事先未知 ;有進入條件和退出條件。

三種循環體: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.logfor 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/nulldone

使用♥,利用for,顯示出一個等腰三角形。

方法一:

for ((i=1;i<10;i++))do    for ((j=1;j<=i;j++))do        echo -n "♥"    done    echodonefor ((i=1;i<9;i++))do    for ((j=9;j>i;j--))do        echo -n "♥"    done    echodone♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥

方法二:

#!/bin/bash2read -p "請輸入三角形的高度: " numfor 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/bashfor ((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 "請輸入三角形邊長: " wfor (( 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    echodone

添加10個用戶user1-user10,密碼為8位隨機字符、

#!/bin/bash> /root/user.logfor 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/nulldone

/etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K開頭的輸出為文件加stop,以S開頭的輸出為文件名加start,如K34filename stop S66filename start

#!/bin/bashfor i in $(ls /etc/rc.d/rc3.d/);do  #查看文件內容確定循環次數    if [[ $i =~ ^K.* ]];then        echo "$i stop"    elif [[ $i =~ ^S.* ]];then        echo "$i start"    fidone[root@centos6mini app]# ./linshi K05wdaemon stopK10saslauthd stopK15htcacheclean stopK15httpd stopK30spice-vdagentd stopK50dnsmasq stopK50kdump stopK73winbind stopK74ntpd stop...省略...

編寫腳本,提示輸入正整數n的值,計算1+2+…+n的總和

#!/bin/bashread -p "請輸入一個正整數" sw=0if [[ "$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/bashfor i in {3..100..3};do  #步進,相加 n=$[$n+$i] &> /devnull doneecho $n

方法三:

#!/bin/bashsum=0for n in $(seq 1 100);do    i=$[$n/3]  #進行相除    y=$[3*$i]  #進行相乘 、運算成功則成立    if [ $y -eq $n ];then        sum=$[$n+$sum]    fidone     echo $sum

方法四:

sum=0for i in {1..100};do  if [ $[$i%3] -eq 0 ];then #相除取余進行判定  let sum+=$i  #進行加法運算  fi doneecho $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    doneechodone

在/testdir目錄下創建10個html文件,文件名格式為數字N(從1到10)加隨機8個字母,如:1AbCdeFgH.html

方法一:

#!/bin/bashcd /testdir &> /dev/nullif [ ! $(echo $?) -eq 0 ] ;then  #判斷文件是否存在  mkdir /testdir &> /dev/nullfifor i in $(seq 1 10 );do  w=$(cat /dev/urandom |tr -dc '0-9a-zA-Z!@_#?.,' |head -c 8)  touch $i$w.htmldone

方法二:

if ! [ -d /testdir ];then  #判斷文件是否存在 mkdir /testdir &> /dev/null  #如果沒有創建文件fifor 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.logfor i in {250..255};do  for n in {1..255};do  {  ping -c1 -w1 172.18."$i"."$n" &> /dev/null  if [ $? -eq 0 ] ;then  echo "ping 172.18."$i"."$n" is up" #>> /root/ip.log  fi  }&  donedone[root@centos6mini zuoye]# ./11.sh ping 172.18.250.14 is upping 172.18.250.26 is upping 172.18.250.71 is upping 172.18.250.81 is upping 172.18.250.112 is upping 172.18.250.154 is upping 172.18.250.164 is upping 172.18.250.166 is upping 172.18.250.183 is upping 172.18.250.195 is upping 172.18.250.212 is upping 172.18.250.216 is upping 172.18.250.224 is upping 172.18.250.249 is upping 172.18.250.250 is upping 172.18.251.18 is up

打印國際象棋棋盤

方法一:

[root@centos6mini zuoye]# cat qipan.sh #!/bin/bashfor n in {1..8};do  for i in {1..8} ;do    if [ $[$n%2] -eq 0  ];then      if [ $[$i%2] -eq 0  ];then         echo -e "/033[41m /033[0m/c"      fi      if [ $[$i%2] -ne 0  ] ;then         echo -e "/033[47m /033[0m/c"              fi    else       if [ $[$i%2] -eq 0  ];then                 echo -e "/033[47m /033[0m/c"            fi            if [ $[$i%2] -ne 0  ] ;then                 echo -e "/033[41m /033[0m/c"                        fi    fi  done  echo done

方法二:

#!/bin/bashfor xline in $(seq 1 8);do  #橫向 for yline in $(seq 1 8);do  #縱向    if [ $[$[$xline+$yline]%2] -eq 0 ];then  #判斷;橫向與縱向相加,最后相除是否等于0     echo -e "/033[47m /033[0m/c"    else     echo -e "/033[41m /033[0m/c"    fi done echo done

方法三:(放大版)

#!/bin/bashfor i in {1..8};do    for x in {1..4};do #控制單行大小。對已有輸出進行放大        for n in {1..8};do            a=`echo $[$[$i+$n]%2]`            if [ $a -eq 0 ];then                echo -e "/e[43m" "" "" "" "" "" "" "" "/e[0m/c"            else                echo -e "/e[42m" "" "" "" "" "" "" "" "/e[0m/c"            fi        done        echo    donedone

while循環

while CONDITION; do
循環體
done

CONDITION:循環控制條件;進入循環之前,先做一次判 斷;每一次循環之后會再次做判斷;條件為“true”,則執行 一次循環;直到條件測試狀態為“false”終止循環

因此:CONDTION一般應該有循環控制變量;而此變量的值 會在循環體不斷地被修正

進入條件:CONDITION為true

退出條件:CONDITION為false

“:” 和true的返回值都為真

[root@centos6mini zuoye]# true
[root@centos6mini zuoye]# echo $?
0
[root@centos6mini zuoye]# :
[root@centos6mini zuoye]# echo $?
0

判斷/var/目錄下所有文件的類型

[root@centos6mini app]# cat linshi #!/bin/bashdc=0lc=0cc=0bc=0oc=0zc=0ls -l /var |grep -v total >/tmp/var_ftype.txtwhile read linesdo  ftype=`echo $lines |awk '{print $1}' |cut -c 1`  case $ftype in    d) dname=`echo $lines |awk '{print $9}'`; echo "$dname is a Directory" ; let dc+=1;;    l) lname=`echo $lines |awk '{print $9}'`; echo "$lname is a Links of Soft " ;let lc+=1 ;;    c) cname=`echo $lines |awk '{print $9}'`; echo "$cname is a Character of file" ;let cc+=1;;    b) bname=`echo $lines |awk '{print $9}'`; echo "$bname is a Block file" ; let bc+=1;;    -) zname=`echo $lines |awk '{print $9}'`; echo "$zname is a common file" ; let zc+=1;;    *) echo "Others files"; let oc+=1  esacdone </tmp/var_ftype.txtecho '-----------------------------' echo -e "var目錄下普通文件數量: $zc/nvar目錄下子目錄數量:$dc/nvar目錄下鏈接文件數量:$lc/nvar目錄下字符類型文件數量: $cc/nvar目錄下塊設備文件數量:$bc/n其他類型文件數量:$oc"rm -f /tmp/var_ftype.txt[root@centos6mini app]# ./linshi cache is a Directorycrash is a Directorycvs is a Directorydb is a Directoryempty is a Directorygames is a Directorygdm is a Directorylib is a Directorylocal is a Directorylock is a Directorylog is a Directorymail is a Links of Soft nis is a Directoryopt is a Directorypreserve is a Directoryrun is a Directoryspool is a Directorytmp is a Directorywww is a Directoryyp is a Directory-----------------------------var目錄下普通文件數量: 0var目錄下子目錄數量:19var目錄下鏈接文件數量:1var目錄下字符類型文件數量: 0var目錄下塊設備文件數量:0其他類型文件數量:0

編寫腳本,求100以內所有正奇數之和

方法一:

[root@centos6mini zuoye]# 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 zuoye]# echo {1..100..2}|tr " " + |bc2500

方法二:

[root@centos6mini 3.19]# ./12500[root@centos6mini 3.19]# cat 1#!/bin/bashu=0 for i in {1..100..2}; do  let u+=idoneecho $u

方法三:

[root@centos6mini 3.19]# ./12500[root@centos6mini 3.19]# cat 1 #!/bin/bashu=0 i=1while [ $i -le 100 ] ;do  let u+=i  let i+=2doneecho $u

編寫腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態,并統計在線和離線主機各多少

方式一:

#!/bin/bashw=0a=0y=0for (( d=0;d<256;d++ ));do  for (( f=1;f<255;f++ ));do    {    ping -c1 -w1 172.18."$d"."$f" &> /dev/null    a=`echo $?`    if [ $a -eq 0 ] ; then       echo "172.18."$d"."$f" up" >> /app/e.txt      echo "172.18."$d"."$f" up "      fi    if [ $a -ne 0 ] ; then             echo "172.18."$d"."$f" down " >> /app/r.txt      echo "172.18."$d"."$f" down "             fi  }&  donedone w=`cat /app/e.txt |wc -l`echo "通的 : $w"y=`cat /app/r.txt |wc -l`echo "不通的 : $y"rm -rf /app/e.txtrm -rf /app/w.txt

方式二:

#!/bin/bashi=1q=1w=0a=0y=0while [ $i -lt 255 ];do  while [ $q -lt 255 ];do    {    ping -c1 -w1 172.18."$i"."$q" &> /dev/null    a=`echo $?`    if [ $a -eq 0 ] ; then       echo "172.18."$i"."$q"  up" >> /app/e.txt      echo "172.18."$i"."$q"  :up"    fi    if [ $a -ne 0 ] ; then             echo "172.18."$i"."$q" down "  >> /app/w.txt                echo "172.18."$i"."$q" down "    fi    }&    let q=q+1      done    let  i=i+1  q=1   ####將q的變量值從新賦值為1done w=`cat /app/e.txt |wc -l`echo "通的主機數為 : $w"y=`cat /app/w.txt |wc -l`echo "不通的主機數為 : $y"rm -rf /app/w.txt /app/e.txt

編寫腳本,打印九九乘法表

[root@centos6mini 3.19]# cat 99 #!/bin/bashq=1w=1while [ $q -le 9 ];do  while [ $w -le 9 ];do    e=0    let e=q*w      if [ $w -le $q ];then    echo -n " $w*$q=$e "    fi  let w+=1  done  let q+=1  w=1  echodone[root@centos6mini 3.19]# ./99 1*1=1  1*2=2  2*2=4  1*3=3  2*3=6  3*3=9  1*4=4  2*4=8  3*4=12  4*4=16  1*5=5  2*5=10  3*5=15  4*5=20  5*5=25  1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

4、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大值和最小值

[root@centos6mini 3.19]# ./4259552574816113197298944190491620220067306094309最大值: 30609最小值: 4309[root@centos6mini 3.19]# cat 4 #!/bin/bashq=1while [ $q -le 10 ] ;do   echo $[RANDOM] &>> /app/o.txt   #echo $[RAND0M] #每次隨機都是新的值  let q+=1  donecat /app/o.txtw=`cat /app/o.txt |sort -rn |tail -n1`e=`cat /app/o.txt |sort -rn | head -n 1`echo "最大值: $e"echo "最小值: $w"rm -rf /app/o.txt

5、編寫腳本,實現打印國際象棋棋盤[

[root@centos6mini 3.19]# cat 5,sh#!/bin/bashq=1w=1while [ $q -le 8 ] ;do  while [ $w -le 8 ] ;do    if [ $[$[$q+$w]%2] -eq 0 ] ;then  ##判斷句中的計算需要$[]括起來:      echo -e "/033[47m /033[0m/c"    else      echo -e "/033[41m /033[0m/c"    fi    let w+=1  done  let q+=1  w=1  echodone

后續六個字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通過對隨機數變量RANDOM隨機執行命令:

echo $RANDOM|md5sum|cut

主站蜘蛛池模板: 国产成人高清成人av片在线看 | 国产wwww | 极品大长腿啪啪高潮露脸 | 一区二区久久久久草草 | 中文字幕在线播放不卡 | 久久精品国产一区二区电影 | 久久国产精品二国产精品中国洋人 | 欧美日韩免费观看视频 | 中文字幕欧美一区二区三区 | 久久久久久久久久网 | 亚洲射情 | 婷婷中文字幕一区二区三区 | 国产瑟瑟视频 | 日韩一级网站 | 久久99精品久久久久久秒播蜜臀 | 亚洲免费毛片基地 | 99riav国产在线观看 | 看毛片电影 | 久久一级 | 91福利免费视频 | 久久恋 | 国产69精品福利视频 | 一本一道久久久a久久久精品91 | 欧美精品网址 | 久久亚洲成人 | 99国产精品国产免费观看 | 在线成人看片 | 欧美日韩在线中文 | 国内精品久久久久久2021浪潮 | 男女生羞羞视频网站在线观看 | 毛片视频播放 | 国产1区2区3区在线观看 | 亚洲一级成人 | 成人爱爱电影 | av在线免费观看网址 | 毛片免费试看 | 在线小视频国产 | 久久精品日韩一区 | 男人的天堂毛片 | 毛片免费视频观看 | 免费一级特黄做受大片 |