Shell筆記8——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循環的應用實踐