三、 Shell流程控制


1. 流程控制語句if基本概述

01. 單分支結構

if [ 如果你有房 ];then
	我就嫁給你
fi

#示例
[root@cc ~/shell]# cat if-1.sh
#!/usr/bin/bash
if which ls;then
echo "ok"
fi

#執行腳本
[root@cc ~/shell]# sh if-1.sh
/usr/bin/ls
ok

02. 雙分支結構

if [ 如果你有房 ];then
    我就嫁給你
else
    再見
fi

#示例
[root@cc ~/shell]# cat if-2.sh
#!/usr/bin/bash
if [ $# -ne 1 ];then
	echo "請輸入一個參數"
	exit
fi
if grep "$1" /etc/passwd;then
	echo "ok!"
else
	echo "error!"
fi

#執行腳本
[root@cc ~/shell]# sh if-2.sh root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ok!

03. 多分支結構

if [ 如果你有錢 ];then
     我就嫁給你
elif [ 你有房 ];then
    我就嫁給你
elif [ 你很努力能吃苦 ];then
    我們試試
else
    再見
fi

#示例
[root@cc ~/shell]# cat if-3.sh
#!/bin/bash
read -p "input a user:" tu
if grep $tu /etc/passwd ; then
	echo "用戶 $tu 存在該系統"
elif ls -d /home/$tu ;then
	echo "用戶 $tu 不存在該系統"
	echo "但是 $tu 用戶家目錄存在"
else
	echo "用戶 $tu 不存在該系統"
	echo "$tu 用戶也不存在家目錄"
fi

#執行腳本
[root@cc ~/shell]# useradd oldboy
[root@cc ~/shell]# sh if-3.sh
input a user:oldboy
oldboy:x:1000:1000::/home/oldboy:/bin/bash
用戶 oldboy 存在該系統

[root@cc ~/shell]# userdel oldboy
[root@cc ~/shell]# sh if-3.sh
input a user:oldboy
/home/oldboy
用戶 oldboy 不存在該系統
但是 oldboy 用戶家目錄存在

[root@cc ~/shell]# sh if-3.sh 
input a user:oldboy
ls: cannot access /home/oldboy: No such file or directory
用戶 oldboy 不存在該系統
oldboy 用戶也不存在家目錄

2. 流程控制語句if文件比較

01. if語句中的文件比較

選項 說明 示例
-e 如果文件或目錄存在則為真 [ -e file ]
-s 如果文件存在且至少有一個字符則為真 [ -s file ]
-d 如果文件存在且為目錄則為真 [ -d file ]
-f 如果文件存在且為普通文件則為真 [ -f file ]
-r 如果文件存在且可讀則為真 [ -r file ]
-w 如果文件存在且可寫則為真 [ -w file ]
-x 如果文件存在且可執行則為真 [ -x file ]

02. 語法示例

語法示例一:

[root@cc ~/shell]# cat if-4.sh
if [ -e /etc/hosts ];then
     echo "ok" 
else
     echo "err" 
fi 

#執行腳本
[root@cc ~/shell]# sh if-4.sh
ok 

語法示例二:

[root@cc ~/shell]# cat if-4.sh
if [ -e /etc/hostss ];then
     echo "ok"
else
     echo "err" 
fi 

#執行腳本
[root@cc ~/shell]# sh if-4.sh
err 

常用測試

[root@cc ~/shell]# [ -f /etc/hosts ] && echo $?
0
[root@cc ~/shell]# [ -f /etc/hostss ] && echo $? 
[root@cc ~/shell]# [ ! -f /etc/hosts ] || echo $?
1
[root@cc ~/shell]# [ ! -f /etc/hostss ] || echo $? 

判斷文件是否存在,返回方式

[root@cc ~/shell]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在" 
文件存在

[root@cc ~/shell]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在" 
文件不存在

[root@cc ~/shell]# [ -d /tmp ] && echo "目錄存在" || echo "目錄不存在" 
目錄存在

[root@cc ~/shell]# [ -d /tmp1 ] && echo "目錄存在" || echo "目錄不存在"
目錄不存在

使用變量的方法進行判斷

[root@cc ~/shell]# dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目錄不存在"
/etc1/目錄不存在

03. 文件比較場景實踐,備份數據庫

1.備份mysql,手動輸入你需要備份的庫名稱

1)提示用戶手動輸入庫名稱:read

2)如果用戶輸入數據庫名稱,則執行mysqldump命令備份

3)備份到哪,/backup/mysql

示例腳本一:

[root@cc ~/shell]# cat mysql_backup1.sh 
#!/usr/bin/bash
DestPath=/backup/mysql 
M_User=root 
M_Pass=123.com 
[ -d $DestPath ] || mkdir -p $DestPath 
read -p "請輸入你要備份的數據庫名稱: " db 
/usr/bin/mysqldump -u$M_User -p$M_Pass --single-transaction -R -B $db > $DestPath/${db}_$(date +%F).sql 
if [ $? -eq 0 ];then
    echo "------------------" 
    echo "$db 數據庫備份成功"
    echo "------------------"
fi 

#執行腳本
[root@cc ~/shell]# sh mysql_backup1.sh 
請輸入你要備份的數據庫名稱: wordpress
--------------------- 
wordpress 數據庫備份成功
--------------------- 

示例腳本二:

[root@cc ~/shell]# cat mysql_backup2.sh
#!/usr/bin/bash
DestPath=/backup/mysql
#M_User=root
#M_Pass=123.com
[ -d $DestPath ] || mkdir -p $DestPath 
read -p "請輸入你要備份的數據庫名稱: " db 
read -p "請輸入你要備份的數據庫用戶: " M_User 
read -p "請輸入你要備份的數據庫密碼: " M_Pass 
/usr/bin/mysqldump -u$M_User -p$M_Pass --single-transaction -R -B $db > $DestPath/${db}_$(date +%F).sql
if [ $? -eq 0 ];then
     echo "------------------"
     echo "$db 數據庫備份成功"
     echo "------------------"
fi 

#執行腳本
[root@cc ~/shell]# sh mysql_backup2.sh
請輸入你要備份的數據庫名稱: wordpress
請輸入你要備份的數據庫用戶: root
請輸入你要備份的數據庫密碼: 123.com
--------------------- 
wordpress 數據庫備份成功
--------------------- 

3. 流程控制語句if整數比較

01. 數值比較[整數1 操作符 整數2 ]

選項 說明 示例
-eq 等於則條件為真 [ 1 -eq 10 ]
-ne 不等於則條件為真 [ 1 -ne 10 ]
-gt 大於則條件為真 [ 1 -gt 10 ]
-lt 小於則條件為真 [ 1 -lt 10 ]
-ge 大於等於則條件為真 [ 1 -ge 10 ]
-le 小於等於則條件為真 [ 1 -le 10 ]

01. 語法示例

等於

[root@cc ~/shell]# [ 1 -eq 2 ] && echo "成立" || echo "不成立"
不成立

[root@cc ~/shell]# [ 1 -eq 1 ] && echo "成立" || echo "不成立" 
成立

大於等於

[root@cc ~/shell]# [ 10 -ge 1 ] && echo "成立" || echo "不成立"
成立

[root@cc ~/shell]# [ 10 -ge 11 ] && echo "成立" || echo "不成立" 
不成立

小於

[root@cc ~/shell]# [ 10 -lt 11 ] && echo "成立" || echo "不成立" 
成立

[root@cc ~/shell]# [ 10 -lt 9 ] && echo "成立" || echo "不成立" 
不成立

大於

[root@cc ~/shell]# [ 10 -gt 9 ] && echo "成立" || echo "不成立" 
成立

[root@cc ~/shell]# [ 10 -gt 11 ] && echo "成立" || echo "不成立" 
不成立

小於

[root@cc ~/shell]# [ 10 -le 11 ] && echo "成立" || echo "不成立" 
成立

[root@cc ~/shell]# [ 10 -le 9 ] && echo "成立" || echo "不成立" 
不成立

不等於

[root@cc ~/shell]# [ 10 -ne 11 ] && echo "成立" || echo "不成立" 
成立

[root@cc ~/shell]# [ 10 -ne 10 ] && echo "成立" || echo "不成立" 
不成立

02. 場景實踐一:編寫一個腳本,檢測服務是否運行

1)如何判斷我們服務是否是運行 systemctl status sshd

2)判斷前者命令執行是否成功,成功則輸出運行,失敗則輸出程序沒有運行

示例腳本如下:

[root@cc ~/shell]# cat systemctl.sh 
#!/usr/bin/bash 
if [ $# -ne 1 ];then
     echo "請輸入一個服務名稱,示例 sh $0 [sshd|httpd|nginx|....]" 
     exit
fi 
systemctl status "$1" &>/dev/null
rc=$?
if [ $rc -eq 0 ];then
     echo "$1 服務正在運行"
elif [ $rc -eq 4 ];then
     echo "$1 沒有這個服務"
else
     echo "$1 服務沒有運行"
fi 

#執行腳本
[root@cc ~/shell]# sh systemctl.sh
請輸入一個服務名稱,示例 sh systemctl.sh [sshd|httpd|nginx|....]

[root@cc ~/shell]# sh systemctl.sh sshd
sshd 服務正在運行

[root@cc ~/shell]# sh systemctl.sh ssh
ssh 沒有這個服務

[root@cc ~/shell]# sh systemctl.sh firewalld
firewalld 服務沒有運行

03. 場景實踐二:查看磁盤/分區當前使用狀態,如果使用率超過80%則報警發郵件

1)怎么查看磁盤使用率

2)怎么提取使用率

3)判斷,整數

示例腳本如下:

[root@cc ~/shell]# cat disk_use.sh 
#!/usr/bin/bash 
disk_use=$(df -h|grep "/$"|awk '{print $(NF-1)}')
if [ ${disk_use/\%/} -ge 80 ];then
     echo "你的磁盤使用率過高... ${disk_use}"
else
     echo "你的磁盤使用率正常... ${disk_use}"
fi 

#執行腳本
[root@cc ~/shell]# sh disk_use.sh
你的磁盤使用率正常... 6%

04. 場景實踐三:條件測試,創建用戶

示例腳本

[root@cc ~/shell]# cat user.sh 
#!/usr/bin/bash
read -p "Please input a username: " user 
id $user &>/dev/null;
if [ $? -eq 0 ]; then
     echo "user $user already exists"
else
     useradd $user
     if [ $? -eq 0 ];then
         echo "$user is created."
     fi
fi 

#執行腳本
[root@cc ~/shell]# sh user.sh
Please input a username: user01
user01 is created. 

[root@cc ~/shell]# sh user.sh
Please input a username: user01
user user01 already exists 

05. 場景實踐四:函數庫使用,判斷url地址是否能通

[root@cc ~/shell]# cat ping.sh 
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
read -p "請輸入一個網址: " url
ping -c 1 -W 1 $url &>/dev/null 
rc=$?
if [ $rc -eq 0 ];then
     action "ping $url is" /bin/true
else 
    action "ping $url is" /bin/false
fi 

4. 流程控制語句if字符比較

01. if字符比較

|-----------------------------------------------------|
|  選項  |       說明               |       示例        |
|-----------------------------------------------------|
|  ==   |  等於則條件為真            |  [ "$a" == "$b" ] |
|-----------------------------------------------------|
|  !=   |  不相等則條件為真          |  [ "$a" != "$b" ] |
|-----------------------------------------------------|
|  -z   |  字符串的長度為零則為真     |  [ -z "$a" ]      |
|-----------------------------------------------------|
|  -n   |  字符串的長度不為零則為真   |  [ -n "$a" ]      |
|-----------------------------------------------------|

02. 字符串比對,必須加雙引號

語法示例:

[root@cc ~/shell]# [ "$USER" == "root" ] && echo $?
0 
[root@cc ~/shell]# [ "$USER" == "roo" ] && echo $? 
[root@cc ~/shell]# [ "$USER" == "roo" ] || echo $? 
1 
[root@cc ~/shell]# [ "$USER" != "root" ] && echo $?
[root@cc ~/shell]# [ "$USER" != "roo" ] && echo $? 
0 

**字符串長度為0 **

[root@cc ~]# AAA=""
[root@cc ~]# echo $AAA 
[root@cc ~]# echo ${#AAA}
0 
[root@cc ~]# [ -z "$AAA" ] && echo $? 
0 

**字符串長度不為0 **

[root@cc ~]# BBB=1 
[root@cc ~]# [ -n "$BBB" ] && echo $? 
0 

腳本示例:

[root@cc ~/shell]# cat if-9.sh 
#!/bin/bash 
read -p "請輸入[yes|no]:" tt
if [ "$tt" == "yes" ];then
     echo "ok"
fi 

#執行腳本
[root@cc ~/shell]# sh if-9.sh
請輸入[yes|no]:yes
ok

[root@cc ~/shell]# sh if-9.sh 
請輸入[yes|no]:no

03. 多整數比對條件

-a 並且,-o 或者

[root@cc ~]# [ 1 -lt 2 -a 5 -gt 10 ] ;echo $?
1
[root@cc ~]# [ 1 -lt 2 -o 5 -gt 10 ] ;echo $?
0

正則比對會用到[[]],|| 或者,&& 並且

[root@cc ~]# [[ 1 -lt 2 || 5 -gt 10 ]] ;echo $?
0
[root@cc ~]# [[ 3 -lt 2 || 5 -gt 10 ]] ;echo $?
1
[root@cc ~]# [[ 3 -lt 2 || 5 -gt 2 ]] ;echo $?
0
[root@cc ~]# [[ 1 -lt 2 && 5 -gt 10 ]] ;echo $?
1
[root@cc ~]# [[ 3 -lt 2 && 5 -gt 10 ]] ;echo $?
1
[root@cc ~]# [[ 3 -lt 2 && 5 -gt 3 ]] ;echo $?
1
[root@cc ~]# [[ 1 -lt 2 && 5 -gt 3 ]] ;echo $?
0

04. 場景實踐:根據學生錄入的成績判斷,學生的優劣

1-59 補考,60-80 合格,80-100 優秀

1)read讀入學生輸入的分數

2)比較分數,看否和哪一個條件

示例腳本一:單條件

[root@cc ~/shell]# cat if-6.sh 
read -p "請輸入你的分數: " fs 
if [ $fs -lt 60 ];then
     echo "補考" 
elif [ $fs -gt 100 ];then
     echo "頑皮" 
elif [ $fs -ge 80 ];then
     echo "優秀" 
elif [ $fs -ge 60 ];then
     echo "合格"
fi 

#執行腳本
[root@cc ~/shell]# sh if-6.sh
請輸入你的分數: 59 
補考

[root@cc ~/shell]# sh if-6.sh 
請輸入你的分數: 60 
合格

[root@cc ~/shell]# sh if-6.sh 
請輸入你的分數: 80 
優秀

[root@cc ~/shell]# sh if-6.sh 
請輸入你的分數: 101 
頑皮

示例腳本二:多條件

[root@cc ~/shell]# cat if-7.sh 
read -p "請輸入你的分數: " fs 
if [ $fs -gt 0 -a $fs -lt 60 ];then
     echo "補考" 
elif [ $fs -ge 60 -a $fs -lt 80 ];then
     echo "合格"
elif [ $fs -ge 80 -a $fs -le 100 ];then
     echo "優秀" 
else
     echo "頑皮"
fi 

#執行腳本
[root@cc ~/shell]# sh if-7.sh 
請輸入你的分數: 4 
補考

[root@cc ~/shell]# sh if-7.sh 
請輸入你的分數: 60 
合格

[root@cc ~/shell]# sh if-7.sh 
請輸入你的分數: 89 
優秀

[root@cc ~/shell]# sh if-7.sh 
請輸入你的分數: 101 
頑皮

[root@cc ~/shell]# sh if-7.sh 
請輸入你的分數: -9 
頑皮

[root@cc ~/shell]# sh if-7.sh 
請輸入你的分數: lkhdjf
if-7.sh: line 2: [: lkhdjf: integer expression expected 
if-7.sh: line 4: [: lkhdjf: integer expression expected 
if-7.sh: line 6: [: lkhdjf: integer expression expected 
頑皮

示例腳本三:條件判斷

[root@cc ~/shell]# cat if-8.sh 
read -p "請輸入你的分數: " fs 

#判斷數字
expr $fs + 1 &>/dev/null 
if [ $? -ne 0 ];then
     echo "請輸入數字。" && exit 
fi 

#判斷是否為空值
if [ -z $fs ];then
     echo "不要嘗試直接回車,不支持" && exit
fi 

#判斷成績
if [ $fs -gt 0 -a $fs -lt 60 ];then
     echo "補考"
elif [ $fs -ge 60 -a $fs -lt 80 ];then
     echo "合格" 
elif [ $fs -ge 80 -a $fs -le 100 ];then
     echo "優秀" else
     echo "頑皮" 
fi 

#執行腳本
[root@cc ~/shell]# sh if-8.sh 
請輸入你的分數: tt 
請輸入數字。

[root@cc ~/shell]# sh if-8.sh 
請輸入你的分數: 
不要嘗試直接回車,不支持

[root@cc ~/shell]# sh if-8.sh 
請輸入你的分數: 88 
優秀

5. 流程控制語句if正則比較

01. 正則比對示例

#單括號無法使用正則語法
[root@cc ~]# [ "$USER" =~ ^r ];echo $? 
-bash: [: =~: binary operator expected 
2 

#使用雙[]才可以
[root@cc ~]# [[ "$USER" =~ ^r ]];echo $? 
0 

#判斷變量是否為數字
[root@cc ~]# num=123 
[root@cc ~]# [[ "$num" =~ ^[0-9]+$ ]];echo $? 
0 
[root@cc ~]# num=123a 
[root@cc ~]# [[ "$num" =~ ^[0-9]+$ ]];echo $? 
1 

02. 示例一:判斷用戶輸入的是否為整數

#示例腳本:
[root@cc ~/shell]# cat if-10.sh
#!/bin/bash
read -p "請輸入一個整數:" num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
    echo "你輸入的不是整數,程序退出!!!"
    exit
fi
echo "你輸入的整數是 $num "

#執行腳本:
[root@cc ~/shell]# sh if-10.sh
請輸入一個整數:aa
你輸入的不是整數,程序退出!!!

[root@cc ~/shell]# sh if-10.sh
請輸入一個整數:89
你輸入的整數是 89 

[root@cc ~/shell]# sh if-10.sh
請輸入一個整數:-4
你輸入的不是整數,程序退出!!!

[root@cc ~/shell]# sh if-10.sh
請輸入一個整數:0.6
你輸入的不是整數,程序退出!!!

03. 示例二:寫一個創建用戶的腳本,需要輸入創建用戶的前綴,比如oldboy,以及后綴。比如123。

#示例腳本:
[root@cc ~/shell]# cat if-11.sh 
#!/usr/bin/bash 
read -p "請輸入用戶的前綴: " qz 
if [[ ! $qz =~ ^[a-Z]+$ ]];then
     echo "你輸入的不是english...."
     exit 
fi 
read -p "請輸入創建用戶的后綴: " hz 
if [[ $hz =~ ^[0-9]+$ ]];then
     user=${qz}${hz}
     id $user &>/dev/null
     if [ $? -eq 0 ];then
         echo "用戶已經存在 $user"
     else
         useradd $user
         echo "用戶創建成功 $user"
     fi 
else 
	echo "你輸入的不是數字...."
exit 
fi 

#執行腳本
[root@cc ~/shell]# sh if-11.sh 
請輸入用戶的前綴: oldboy 
請輸入創建用戶的后綴: 123 
用戶創建成功 oldboy123 

[root@cc ~/shell]# sh if-11.sh 
請輸入用戶的前綴: oldboy 
請輸入創建用戶的后綴: 123 
用戶已經存在 oldboy123 

6. 流程控制語句if場景示例

01. 場景示例:使用root用戶清空/var/log/messages日志,並每次執行保留最近100行

1)判斷必須是root

2)判斷文件必須存在

3)清空后需要保留最近100

示例腳本

[root@cc ~/shell]# cat if-12.sh
#!/usr/bin/bash
#1.判斷用戶是否是root,並且UID為0
if [ $UID -eq 0 ] && [ $USER == "root" ] ;then
    #2.判斷文件是否存在
    if [ -f /var/log/messages ];then
        #保留最近100行
        tail -100 /var/log/messages > /var/log/messages.bak
        cat /var/log/messages.bak > /var/log/messages
            echo "=======成功=========="
    else
        echo "文件/var/log/messages 不存在"
    fi
else
    echo "$USER 對$0 腳本沒有執行權限"
fi

#執行腳本
[root@cc ~/shell]# sh if-12.sh
=======成功==========

#切換普通用戶測試
[root@cc ~/shell]# cp if-12.sh /home/oldboy123/
[root@cc ~/shell]# su - oldboy123
[oldboy123@cc ~]$ 
-rwxr-xr-x 1 root root 438 Jun 27 11:15 if-12.sh
[oldboy123@cc ~]$ sh if-12.sh oldboy123 對if-12.sh 腳本沒有執行權限
[root@cc ~/shell]# mv /var/log/messages /var/log/messages.org
[root@cc ~/shell]# sh if-12.sh 
文件/var/log/messages 不存在

示例腳本二:

[root@cc ~/shell]# cat if-13.sh
#!/usr/bin/bash
#1.判斷用戶是否是root,並且UID為0
if [ ! $UID -eq 0 ] && [ ! $USER == "root" ] ;then
    echo "$USER 對$0 腳本沒有執行權限"
    exit
fi

#2.判斷文件是否存在
if [ ! -f /var/log/messages ];then
     echo "文件/var/log/messages 不存在"
     exit 
fi    

#3.保留最近100行
tail -100 /var/log/messages > /var/log/messages.bak
cat /var/log/messages.bak > /var/log/messages
        echo "=======成功=========="

#執行腳本
[root@cc ~/shell]# sh if-13.sh
=======成功==========

02. 場景示例:判斷sshd服務是否正常啟動

1)手動怎么判斷服務是正常

2)先判斷服務是否是啟動的

3)如果服務是啟動再判斷端口是否存在

4)最后判斷進程是否存在

示例腳本如下:

[root@cc ~/shell]# cat if-13.sh 
#!/usr/bin/bash 
#1.判斷服務是否啟動
ssh_status=$(systemctl status sshd|awk '/^.*Active/ {print $2}') 
if [ "$ssh_status" == "active" ];then
     sleep 1     echo "sshd服務監測是 ${ssh_status}......" 
else
     sleep 1
     echo "sshd服務監測是 ${ssh_status}......." 
fi 

#2.判斷端口是否存在
netstat -lntp|grep "sshd" &>/dev/null 
if [ $? -eq 0 ];then
     sleep 1
     echo "sshd服務端口存活....." 
else
     sleep 1
     echo "sshd服務端口不存在...." 
fi 

#3.判斷進程是否存在
ps axu|grep sshd|grep -v grep|grep -v "pts" &>/dev/null 
if [ $? -eq 0 ];then
     sleep 1
     echo "sshd服務進程是存在..." 
else
     sleep 1
     echo "sshd服務進程不存在...."
     ps axu|grep sshd|grep -v grep 
fi 

#執行腳本:
[root@cc ~/shell]# sh if-13.sh 
sshd服務監測是 active...... 
sshd服務端口存活..... 
sshd服務進程是存在.. 

[root@cc ~/shell]# sh if-13.sh 
sshd服務監測是 inactive....... 
sshd服務端口不存在.... 
sshd服務進程不存在.... 
root 26830 0.0 0.6 161496 6152 ? Ss 10:00 0:00 sshd: root@pts/0 

03. 場景示例:根據不同的系統安裝不同的yum源

1)系統的版本如何判斷

示例腳本

[root@cc ~/shell]# cat if-14.sh 
tt=$(awk '{print $(NF-1)}' /etc/redhat-release)
if [ ${tt%%.*} -eq "6" ];then*
	mkdir -p /etc/yum.repos.d/backup
    mv /etc/yum.repos.d/.*repo /etc/yum.repos.d/backup/*
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    echo "CentOS $tt 系統已經配置好yum倉庫"
elif [ ${tt%%.*} -eq "7" ];then
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
echo "CentOS $tt 系統已經配置好yum倉庫"
fi

#執行腳本
[root@cc ~/shell]# sh if-14.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 28789 0 --:--:-- --:--:-- --:--:-- 45053
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 664 100 664 0 0 11023 0 --:--:-- --:--:-- --:--:-- 11066
CentOS 7.6.1810 系統已經配置好yum倉庫

#查看結果
[root@cc ~/shell]# ll /etc/yum.repos.d/
total 8
drwxr-xr-x 2 root root 65 Jun 27 21:54 backup
-rw-r--r-- 1 root root 2523 Jun 27 21:54 CentOS-Base.repo
-rw-r--r-- 1 root root 664 Jun 27 21:54 epel.repo

7. 流程控制語句case基本概述

01. case用來實現對程序流程的選擇、循環等進行控制。語法如下

case 變量 in
變量1)
     命令序列 1
     ;;
變量2)
     命令序列 2
     ;;
變量3)
     命令序列 3
     ;;
*)
     無匹配后命令序列
esac

02. case演示示例,安裝不同的PHP版本。

[root@cc /scripts]# cat case1.sh 
#!/usr/bin/bash 
cat <<-EOF
----------------------------------
| 1. Installed PHP 5.5 
| 2. Installed PHP 5.6 
| 3. Installed PHP 7.0 
| 4. Exit 
---------------------------------
EOF 
read -p "請輸入你要安裝的php版本[1|2|3|4]: " install 
case $install in
     1)
         echo "正在安裝5.5版本的PHP,請稍后...."
         sleep 3
         echo "安裝5.5版本的PHP安裝成功!"
         ;;
     2)
         echo "正在安裝5.6版本的PHP,請稍后...."
         sleep 3
         echo "安裝5.6版本的PHP安裝成功!"
         ;;
     3)
         echo "正在安裝5.5版本的PHP,請稍后...."
         sleep 3
         echo "安裝5.5版本的PHP安裝成功!"
         ;;
 4) 
        exit 
esac 

#執行腳本
[root@cc /scripts]# sh case1.sh
-------------------------- 
| 1. Installed PHP 5.5 
| 2. Installed PHP 5.6 
| 3. Installed PHP 7.0 
| 4. Exit
-------------------------- 
請輸入你要安裝的php版本[1|2|3|4]: 1 
正在安裝5.5版本的PHP,請稍后.... 
安裝5.5版本的PHP安裝成功!

[root@cc /scripts]# sh case1.sh 
-------------------------- 
| 1. Installed PHP 5.5 
| 2. Installed PHP 5.6 
| 3. Installed PHP 7.0 
| 4. Exit 
-------------------------- 
請輸入你要安裝的php版本[1|2|3|4]: 4 

8. 流程控制語句case場景示例

01. 場景示例一:寫一個rsync的啟動和停止的腳本

1.如何啟動的命令 rsync --daemon

​ ps aux|grep rsync|grep -v grep

2.如何停止kill,

​ pkill rsync

使用if判斷

[root@cc /scripts]# cat daemon.sh 
#!/usr/bin/bash 
source /etc/init.d/functions 
rs=$1 
#1.如果用戶傳遞的第一個位置參數是start則執行如下if語句
if [ $rs == "start" ];then

#在啟動rsync服務前,先判斷是否存在pid文件(手動創建的pid文件) 
	if [ ! -f /var/run/rsync.pid ];then
     #如果不存在pid,則手動創建並啟動服務(加鎖機制)
         touch /var/run/rsync.pid
         rsync --daemon
         action "Rsync Starting...." /bin/true 
	else
         action "Rsync Service Running..." /bin/false 
	fi 
elif [ $rs == "stop" ];then 
	if [ ! -f /var/run/rsync.pid ];then
         action "Rsync Service Stoppend...." /bin/false
	else
         #如果停止服務,一定需要刪除pid
         rm -f /var/run/rsync.pid
         pkill rsync
         action "Rsync Stopting....." /bin/true 
	fi 
elif [ $rs == "status" ];then 
	if [ ! -f /var/run/rsync.pid ];then
         echo "Rsync Service Status InActive...." 
	else
         Rsync_Status=$(ps aux|grep rsync|grep -v grep|awk '{print $2}') 
         echo "Rsync Service Status Active( pid號為:"$Rsync_Status" )" 
	fi 
else
     echo "USAGE: $0 {start|stop}"
     exit 
fi 

使用case語句

[root@cc /scripts]# cat rsync.sh 
#!/usr/bin/bash 
source /etc/init.d/functions 
rs=$1 
case $rs in
    start)
     	if [ ! -f /var/run/rsync.pid ];then
             touch /var/run/rsync.pid
             rsync --daemon
             action "Rsync Starting...." /bin/true
     	else
             action "Rsync Service Running..." /bin/false
     	fi
         ;; 
    stop)
     	if [ ! -f /var/run/rsync.pid ];then
             action "Rsync Service Stoppend...." /bin/false
    	else
             rm -f /var/run/rsync.pid
             pkill rsync
             action "Rsync Stopting....." /bin/true
     	fi 
        ;; 
    status)
     	if [ ! -f /var/run/rsync.pid ];then
             echo "Rsync Service Status InActive...."
     	else
             Rsync_Status=$(ps aux|grep rsync|grep -v grep|grep -v pts|awk '{print $2}')
             echo "Rsync Service Status Active( "$Rsync_Status" )"
     	fi
         ;; 
    *)
         echo "USAGE: $0 {start|stop|status}"
         exit
esac 

02. 場景示例二:編寫一個nginx的啟動和停止腳本。

1.如何啟動 /usr/sbin/nginx

2.如何停止 /usr/sbin/nginx -s stop

3.如何重載 /usr/sbin/nginx -s reload

[root@cc /scripts]# cat case-4.sh 
#!/usr/bin/bash 
source /etc/init.d/functions 
#加鎖
if [ -f /tmp/nginx.lock ];then
     echo "此腳本正在運行,請稍后....."
     exit 
fi 
touch /tmp/nginx.lock 
rc=$1 
case $rc in
     start) 
        if [ -f /var/run/nginx.pid ];then
             action "nginx服務已經啟動...." /bin/false
             exit 
else
             /usr/sbin/nginx
             action "nginx服務啟動成功..." /bin/true
         fi
         ;;
     stop)
         if [ -f /var/run/nginx.pid ];then
             /usr/sbin/nginx -s stop
             if [ $? -eq 0 ];then
                 action "nginx關閉成功..." /bin/true
             else
                 action "nginx關閉失敗..." /bin/false
             fi
         else
             action "nginx已經關閉...[error] open() /run/nginx.pid" /bin/false
         fi 
                ;;
     reload)
         if [ -f /var/run/nginx.pid ];then
             sleep 2
             /usr/sbin/nginx -s reload
             if [ $? -eq 0 ];then
                 action "nginx重載成功..." /bin/true
             else 
                action "nginx重載失敗..." /bin/false
                 fi
         else
             action "nginx沒有啟動,無法完成重載" /bin/false
         fi 
        ;;
     status)
         if [ -f /var/run/nginx.pid ];then
             nginx_pid=$(cat /var/run/nginx.pid)
             echo "nginx ( $nginx_pid ) is running...." 
        else
             echo "nginx is Not running...."
         fi 
        ;;
         *) 
        echo "USAGE: $0 [ start | stop | reload | status ] " 
esac 

#解鎖
rm -f /tmp/nginx.lock 

加強版

[root@cc /scripts]# cat case-5.sh 
#!/usr/bin/bash 
source /etc/init.d/functions 
#加鎖
Lock=/tmp/nginx.lock 
if [ -f $Lock ];then
     echo "此腳本正在運行,請稍后....."
     exit 
fi 
touch $Lock 
rc=$1
case $rc in
     start) 
        if [ -f /var/run/nginx.pid ];then
         sleep 10 
            action "nginx服務已經啟動...." /bin/false 
else
            /usr/sbin/nginx
             action "nginx服務啟動成功..." /bin/true
         fi 
        ;; 
    stop)
         if [ -f /var/run/nginx.pid ];then
             /usr/sbin/nginx -s stop
             if [ $? -eq 0 ];then
                 action "nginx關閉成功..." /bin/true
             else
                 action "nginx關閉失敗..." /bin/false
             fi
         else
             action "nginx已經關閉...[error] open() /run/nginx.pid" /bin/false
         fi
                  ;; 
    reload)
         if [ -f /var/run/nginx.pid ];then
             /usr/sbin/nginx -t &>/dev/null
             if [ $? -eq 0 ];then
                 /usr/sbin/nginx -s reload
                 if [ $? -eq 0 ];then
                     action "nginx重載成功..." /bin/true
                 else
                     action "nginx重載失敗..." /bin/false
                     fi
             else
                 /usr/sbin/nginx -t &>err.txt
                 nginx_conf=$(awk -F "[: ]" 'NR==1{print $(NF-1)}' err.txt) 
                 nginx_line=$(awk -F "[: ]" 'NR==1{print $(NF)}' err.txt)
                 /usr/sbin/nginx -t
                 read -p "$nginx_conf 配置文件有錯,在第 $nginx_line 行, 是否要需要進行配置修改[y|n]: " re
                 case $re in
                     y|yes|YES)
                         vim +${nginx_line} ${nginx_conf}
                         ;;
                     n|no|NO) 
                        echo "你可以選擇手動修改,再見!"
                         ;;
                     *)
                         echo "USAGE: $0 {y|n} " 
                esac 
            fi
        else
             action "nginx沒有啟動,無法完成重載" /bin/false
         fi
         ;;
     status)
         if [ -f /var/run/nginx.pid ];then
             nginx_pid=$(cat /var/run/nginx.pid)
             echo "nginx ( $nginx_pid ) is running...."
         else
             echo "nginx is Not running...."
         fi
         ;;
     *)
         echo "USAGE: $0 [ start | stop | reload | status ] "
esac 

#解鎖
rm -f $Lock 

03. 場景示例三:實現系統管理工具箱

[root@cc /scripts]# cat case-6.sh 
cat <<-EOF 
=================== 
h 顯示命令幫助
f 顯示磁盤分區
d 顯示磁盤掛載
m 查看內存使用
u 查看系統負載
q 退出程序
===================== 
EOF read -p "請輸入你需要做的操作: " sys 
case $sys in
     f)
         df -h
         ;;
     d)
         mount -a |less
         ;;
     u)
         w
         ;;
     q)
         exit
         ;;
     *)
         echo "USAGE: $0 [ h | f | d | m | u | q ]" 
esac 

04. 場景示例四:實現簡單的JumpServer

1.執行腳本后,需要看到所有我能管理的主機

2.有一個選擇菜單,提示輸入連接某個主機

3.需要寫一個死循環,保證程序連接后端服務,退出后還能接着選擇主機。

4.不能讓跳板機直接ctrl+c ctrl+z退出了,trap 控制ctrl+c ctrl+z的信號

5.退出服務器的會話,再次登錄,又可以正常操作服務器。將腳本加入到/etc/bashrc中,當用戶一連接,自動就運行該腳本。

[root@cc /scripts]# cat jumpserver1.sh
#!/usr/bin/bash
meminfo(){
cat <<-EOF
-------------------------------
| 1) db01-172.16.1.52 |
| 2) db02-172.16.1.53 |
| 3) db02-172.16.1.54 |
| h) help |
---------------------------------
EOF
}
meminfo
read -p "請輸入你需要連接的主機序號[1|2|3|..]: " connection
case $connection in
    1)
        ssh root@172.16.1.52
            ;;
    2)
        ssh root@172.16.1.53
            ;;
    3) 
       ssh root@172.16.1.54
            ;;
    h)
        clear
        meminfo
        ;;
    exec)
        exit
        ;;
    *)
        echo "USAGE: $0 輸入連接的主機編號即可 [ 1 | 2 | 3 | ]"
esac

加強版

[root@cc /scripts]# cat jumpserver2.sh
#!/usr/bin/bash
meminfo(){
cat <<-EOF
-------------------------------
| 1) db01-172.16.1.52 |
| 2) db02-172.16.1.53 |
| 3) db02-172.16.1.54 |
| h) help |
---------------------------------
EOF
}
meminfo
    trap "" HUP INT TSTP #控制不讓輸出Ctrl+c,z
while true
do
    read -p "請輸入你需要連接的主機序號[1|2|3|..]: " connection
    case $connection in
        1)
            ssh root@172.16.1.52
                ;;
        2)
            ssh root@172.16.1.53
                ;;
        3)
            ssh root@172.16.1.54
                ;;
        h) 
           clear
            meminfo
            ;;
        exec) 
           exit
            ;;
        *)
            echo "USAGE: $0 輸入連接的主機編號即可 [ 1 | 2 | 3 | ]"
    esac
done

05. 場景示例五:實現多級菜單功能

[root@web01 ~]# cat case-7.sh 
#!/usr/bin/bash 
mem_option (){ 
cat <<-EOF
---------主菜單---------- 
| 1) 安裝nginx | 
| 2) 安裝php | 
| 3) 退出 | 
-------------------------- 
EOF
 } 
mem_install_nginx(){ 
cat <<-EOF 
-----Installed Nginx ----- 
| 1) 安裝nginx1.1 | 
| 2) 安裝nginx1.2 | 
| 3) 安裝nginx1.3 | 
| 4) 返回上一頁 | 
-------------------------- 
EOF 
} 
mem_install_php(){
cat <<-EOF 
-------------------------- 
| 1) 安裝php5.5 | 
| 2) 安裝php5.6 | 
| 3) 安裝php7.0 | 
| 4) 返回上一頁 | 
-------------------------- 
EOF 
} 

#---------------------------------------------------------------------- 
while true 
do
     mem_option
     read -p "請輸入主菜單需要選擇的選項,使用方法[1|2|3]: " option
     case $option in
         1)
             clear
             while true
             do
                 mem_install_nginx
                 read -p "請輸入你要安裝Nginx的Version: " nginx_install_option
                 case $nginx_install_option in
                     1)
                         clear
                         echo "Installed Nginx Version 1.1 is Done....."
                         sleep 1
                         ;;
                     2)
                         clear
                         echo "Installed Nginx Version 1.2 is Done....."
                         sleep 1
                         ;;
                     3)
                         clear
                         echo "Installed Nginx Version 1.3 is Done....."
                         sleep 1
                         ;;
                    4)
                         clear
                         break
                         ;;
                 esac
             done
             ;;
         2)
             clear
             while true
             do
                 mem_install_php
                 read -p "請輸入你要選擇的php Version: " php_install_option
                 case $php_install_option in
                     1)
						 clear
                         echo "Installed php Version 5.5 is Done....." 
						 sleep 1
                         ;;
                     2)
						 clear
                         echo "Installed php Version 5.6 is Done....."
						 sleep 1
                         ;;
                     3)
						 clear
                         echo "Installed php Version 5.7 is Done....." 
						 sleep 1
                         ;;
                     4)
                         clear
                         break
                         ;;
                     *)
                 esac
             done
             ;;
         3)
             exit
             ;;
         *)
             echo "USAGE: [ 1 | 2 |3 ]"
     esac
done 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM