1. 程式人生 > >Shell筆記8——for和select循環的應用實踐

Shell筆記8——for和select循環的應用實踐

linux 運維 shell腳本

本文主要講解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































Shell筆記8——for和select循環的應用實踐