本節所講內容:
- 21.1 case - 流程控制語句
- 21.2 循環語句
- 21.3 while循環語句和循環嵌套
- 21.4 實戰-3個shell腳本實戰
21.1 流程控制語句:case
控制語句:用來實現對程序流程的選擇、循環、轉向和返回等進行控制。case是開關語句的一個組成部分;
它是根據變量的不同進行取值比較,然後針對不同的取值分別執行不同的命令操作
適用於多分支,是一個多選擇語句
case 變量或表達式 in
變量或表達式1)
命令序列1
;;
變量或表達式2)
命令序列2
;;
……
*)
默認命令序列
esac
case語句執行流程控制:
執行流程:
首先使用“變量或表達式”的值與值1進行比較,若取值相同則執行值1後的命令序列,直到遇見雙分號“;; ”後跳轉至esac,表示分支結束;
若與值1不相匹配,則繼續與值2 進行比較,若取值相同則執行值2 後的命令序列,直到遇見雙分號“;; ”後跳轉至esac,表示結束分支。
依次類推,若找不到任何匹配的值,則執行默認模式“ *) ”後的命令序列,直到遇見esac後結束分支
注意事項:
“變量或表達式”後面必須爲單詞in,每一個“變量或表達式”的值必須以右括號結束。取值可以爲變量或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;
匹配中的值可以是多個值,通過“|”來分隔
例1:編寫一個操作文件的腳本
[root@xuegod63 ~]# cat case-1.sh
#########################################################################
# File Name: case-1.sh
# Author: xuegod
#########################################################################
#!/bin/bash
cat <<eof
****************
** 1. backup **
** 2. copy **
** 3. quit **
****************
eof
read -p "Input a choose: " OP
case $OP in
1|backup)
echo "BACKUP......"
;;
2|copy)
echo "COPY....."
;;
3|quit)
exit
;;
*)
echo error
esac
例2:編寫一個啓動apache服務腳本
[root@xuegod63 ~]# yum install httpd -y
[root@xuegod63 ~]# vim case-2.sh
#!/bin/bash
case $1 in
start)
systemctl $1 httpd
ps aux|grep httpd
echo "httpd start"
;;
stop)
systemctl $1 httpd
ps aux|grep httpd
echo "httpd stop"
;;
status)
systemctl $1 httpd
;;
restart)
systemctl $1 httpd
echo "httpd restart"
;;
*)
echo "USAGE: $0 start|stop|restart"
esac
Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍
21.2 循環語句
21.2.1 for-do-done
語法格式:
for var in list
do
commands
done
或:
for var in list ; do
commands
done
取值列表有多種取值方式,比如
可以直接讀取in 後面的值,默認以空格做分隔
[root@xuegod63 ~]# vim for-1.sh
#!/bin/bash
for var in a1 b1 c1 d1
do
echo the text is $var
done
列表中的複雜值,可以使用 引號或轉義字符”/”來加以約束
[root@xuegod63 ~]# cat for-2.sh
#!/bin/bash
for var in a1 b1 "c1 d1" e2 "hello world"
do
echo the text is $var
done
[root@xuegod63 ~]# cat for-3.sh
#!/bin/bash
for var in a1 b\'1 "c1 d1" e2 "hello world" I\'s a22
do
echo the text is $var
done
從變量中取值
[root@xuegod63 ~]# cat for-4.sh
#!/bin/bash
list="a1 b1 c1 d1"
for i in $list
do
echo is a $i
done
4、從命令中取值
[root@xuegod63 ~]# cat for-5.sh #以空格做分隔符
#!/bin/bash
for i in `cat /etc/hosts`
do
echo "$i"
done
5、自定義shell分隔符
-
默認情況下,base shell會以空格、製表符、換行符做爲分隔符。通過IFS來自定義爲分隔符 指定單個字符做分隔符: IFS=:
#以:冒號做分隔符 可以指定多個 如 IFS=’\n’:;" #這個賦值會將反斜槓、n、冒號、分號和雙引號作爲字段分隔符。注:KaTeX parse error: Expected 'EOF', got '\n' at position 2: '\̲n̲'與'\n'時的區別 IFS=…’\n’
#正真的使用換行符做爲字段分隔符。[root@xuegod63 ~]# cat for-6.sh #指定以\n回車做爲 for語句的分隔符
#!/bin/bash
IFS=KaTeX parse error: Expected 'EOF', got '\n' at position 2: '\̲n̲' for i in `ca…i"
done
[root@xuegod63 ~]# cat for-7.sh #以:冒號做分隔符
#!/bin/bash
IFS=:
list=head -1 /etc/passwd
for i in $list
do
echo $i
done
6、C語言風格的for
語法格式:
for ((i=0;i<10;i++))
do
commmands
done
例1:單個變量。 輸出1到10之間的數字
[root@xuegod63 ~]# cat for-8.sh
#!/bin/bash
for (( i=1 ; i<=10 ; i++ ))
do
echo num is $i
done
注:
互動: i++ 這一條語句在for循環體中哪個位置執行?
for (( i=1 ; i<=10 ; )) #i=1 只賦值一次。然後執行 i <= 10
do
echo num is $i
i=$(($i+1)) # i++在這裏執行。 當for循環體中所有命令執行完後,再執行i++
done
例2:多個變量。 同時輸出1-9的升序和降序
[root@xuegod63 ~]# cat for-8.sh
#!/bin/bash
for ((a=1,b=9 ; a<10 ; a++,b--))
do
echo num is $a - $b
done
Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍
21.3 while循環語句和循環嵌套
21.3.1 while-do-done
重複測試指令的條件,只要條件成立就反覆執行對應的命令操作,直到命令不成立或爲假;
語法格式如下:
while 測試命令
do
命令
done
注意:避免陷入死循環 while true
例1:降序輸出10到1的數字
[root@xuegod63 ~]# cat while-1.sh
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
echo $var
var=$[$var-1]
done
例2:輸出如下圖兩數相乘的效果
自增操作 let var++
自減操作 let var--
[root@xuegod63 ~]# cat while-2.sh
#!/bin/bash
num=1
while [ $num -lt 10 ]
do
sum=$(( $num * $num ))
echo "$num * $num = $sum"
((num++))
# let num++
done
21.3.2 嵌套循環
例1:批量添加a.txt文件5個用戶
[root@xuegod63 ~]# vim a.txt #添加5個用戶
mk
cd
ls
find
ln
編寫腳本的思路
-
1 明確腳本的功能
-
2 編寫腳本時會使用到那些命令 ? useradd passwd for
-
3 把變化的數據使用變量表示
-
4 選擇適合的流程控制 (選擇 、 循環 、分支)
[root@xuegod63 ~]# cat for-adduser.sh
#!/bin/bash
for name incat /root/a.txt
#for name in $(cat /root/a.txt)
do
id $name &> /dev/null
if [ $? -ne 0 ];then
useradd $name
echo “123456” |passwd --stdin $name &> /dev/null
echo “user $name created”else echo "user $name is exist" fi
done
注:&> 是正確和錯誤的信息都重定向到/dev/null裏面
例2 :打印九九乘法表
-
注:外層循環循環行,內層循環循環列 規律: 內層循環的變量<=外層循環的變量
[root@xuegod63 ~]# cat for-for.sh
for i inseq 9
do
for j inseq $i
do
echo -n "j=echo $(($i*$j))
"
done
echo " "
done
21.4 實戰-3個shell腳本實戰
21.4.1 實戰-將/opt目錄下所有的日誌文件全自動打包[root@xuegod63 ~]# vim log-back.sh
#!/bin/sh
SRC_DIR=/var/log/
DES_DIR=/opt/backup/date +%Y%m%d
if
[ ! -d $DES_DIR ] ; then
mkdir -p $DES_DIR
fi
for i infind $SRC_DIR -name "*.log"
do
tar czf $i.tgz $i
done
mv /var/log/*.tgz $DES_DIR
ls -lh $DES_DIR
echo “The scripts exec end, Files tar successfully !”
21.4.2 實戰-找出192.168.1.1-10網段中,服務器已經關機的IP地址[root@xuegod63 ~]# vim ping.sh
#!/bin/bash
i=1
for (( i=1;i<10;i++ ))
do
ping -c 3 192.168.1.$i &> /dev/null
if [ i is shutdown
fi
done
21.4.3 批量創建帳號並生成隨機密碼[root@xuegod63 ~]# vim adduser.sh
#!/bin/bash
for i in xuegoda{1…10}
do
useradd i:$pass" >> /tmp/passwd.log
echo $pass |passwd --stdin $i > /dev/null 2>&1
if [ $? -eq 0 ];then
echo “create user is successfully!”
else
echo “create user is failed!”
fi
done
Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍
微信公衆號:
MK老師微信號:
總結:
- 21.1 case - 流程控制語句
- 21.2 循環語句
- 21.3 while循環語句和循環嵌套
- 21.4 實戰-3個shell腳本實戰