1-23-shell腳本之-if流程控制語句和for循環語句的使用


大綱:

1、邏輯判斷

2、if流程控制語句

3、for循環控制語句

 

----------------------------------------------

在開始之前,先了解一下邏輯判斷符號:

&& 與、|| 或、!

A && B  必須A,B同時成立,才能通過判斷

---> 判斷流程:先執行A判斷其是否成立,若成立,則繼續執行B,判斷其是否成立

---> 若不成立,則直接結束,不再執行B

A || B  A、B有一個成立,即可通過判斷

!A     若A不成立,則通過判斷

----------------------------------------------

----------------------------------------------

在條件判斷時,那面會比較數值或字符串,這是我們會用到一些參數和符號,如下

比較數值:

等於 ---> –eq

不等於 ---> –ne

小於 ---> –lt

大於 ---> –gt 

小於等於 ---> –le

大於等於 ---> –ge

一些英文單詞:幫助記憶

equal等於、not equal、less than、great than

比較字符串:

= 等於、== 等於,同=、!= 不等於、> 大於、<小於、-z字符串為空、-n字符串非空null

注意:在[]結構中,<和>需要使用轉義符號,如下圖

image

實戰1:判斷當前系統語言環境

image

[root@xiaogan 02]# echo $LANG
en_US.UTF-8
[root@xiaogan 02]# echo $LANG | awk -F . '{print $1}'
en_US
[root@xiaogan 02]# vim lang.sh
[root@xiaogan 02]# sh -x lang.sh
++ echo en_US.UTF-8
++ awk -F . '{print $1}'
+ language=en_US
+ '[' en_US = en_US ']'
+ echo 'The Default Language is English.'
The Default Language is English.
[root@xiaogan 02]# cat lang.sh
#!/bin/bash
# judged if the System Default Language is English

language=$(echo $LANG | awk -F . '{print $1}')

if
    [ $language = 'en_US' ]
then echo "The Default Language is English."
else echo "You are wrong!"
fi

[root@xiaogan 02]#


----------------------------------------------

if流程控制語句

 

if語句有三種使用方式:

格式如下:

單分支:

if 條件判斷語句

then 執行語句

fi

雙分支:

if 條件判斷語句

then 執行語句

else 執行語句

fi

多分支:

if 條件判斷語句

then 執行語句

else 執行語句

fi

##################################
實戰1:if單分支--->應用

image

源碼如下:

#!/bin/bash
# if
# then
# fi

if [ ! -d /root/cdrom ]
then echo "/root/cdrom is not exist!"
fi

##################################
實戰2:if雙分支應用--->pinghost.sh
ping -c 3 -i 0.2 -w 3 192.168.0.1

-c 發送數據包個數

-i 數據包每次發送間隔時間,默認單位:秒(s)

-w 等待時間,超過返回失敗

image

源碼如下:

#!/bin/bash
# ping a given host and print the host status

ping -c 3 -i 0.2 -w 3 $1 >>/dev/null #-c count -i  -w wait
if [ $? -eq 0 ]
then echo "the host $1 is up."
else echo "the host $1 is down."
fi

##################################

實戰3:if多分支應用--->判斷數值區間 num_where.sh

image

源碼如下:

#!/bin/bash
# judged the input score

read -p "input you score(0-100):" num

if [ $num -gt 85 ] && [ $num -lt 100 ]
then echo "Great! Good Good Study!!"
else echo "Day Day Up!"
fi

##################################

實戰4:if嵌套使用

編寫腳本,監控服務運行狀態
啟動失敗后,保存日志,並重啟服務,
再次失敗,提示重啟主機

image

源碼如下:

#!/bin/bash

systemctl status $1 >>/var/log/ser.log

if [ $? -eq 0 ]
then echo "the $1 is running."
else echo "the $1 is dead."
    systemctl start $1 >>/dev/null
    if [ $? -eq 0 ]
    then echo "Reboot finish!"
        systemctl restart $1
    else echo "Warnning You to Reboot your server!"
    fi
fi

##################################
實戰5:查詢內核版本,並輸出信息

image

源碼如下;

#!/bin/bash
# search the major version of System, and print info.

prime=$(uname -r | awk -F . '{ print $1}')

if [ $prime -gt 2 ]
    then echo "The major version of System is $prime."
elif [ $prime -lt 1 ]
    then echo "The System is too low."
else echo "Failed!"
fi

----------------------------------------------

for循環控制語句

用法:

for 變量名 in 變量遍歷列表

do

循環語句

done #循環結束表示

##################################

實戰:用戶管理(批量添加用戶)

方法一:

運行環境:

image

輸出結果:

image

批量刪除用戶:

image

方法一優化:

我們發現,在用方法一批量添加用戶是,當用戶不存在時,會有報錯信息。查看運行過程如下:

sh –x for01_useradd.sh

image

在進入循環后,我們會首先查找/etc/passwd下,是否已存在用戶$user,

但是,在運行過程中,我們發現,當這個用戶不存在時user_a數值為空,判斷條件就會少了一個比較值,而造成判斷條件變為:[ = xiaogan ],這是系統就會報錯!

為了避免系統報錯,我們可使用-z 或 -n選項來判斷user_a變量是否為空。

image

執行結果如下:

image

方法二:我們也可以采取另外一種方法,來批量添加用戶

image

各方法源碼如下:

方法一:

#useradd.sh

#!/bin/bash
userlist=$( cat user.list )


for user  in $userlist
do
user_a=$(grep -w "$user" /etc/passwd  | awk -F : '{print $1}' )
if
    [ $user_a = $user ]
then
    echo "The user $user is already exist."
else
    useradd $user #2>>/dev/null
    echo "User $user is added."
fi
done

###########

#userdel.sh

#!/bin/bash
userlist=$( cat user.list )

for user  in $userlist
do
    userdel -r $user 2>>/dev/null
    if [ $? = 0 ]
    then
        echo "The user $user is deleted!"
    fi
done

優化:

#useradd.sh

#!/bin/bash
userlist=$( cat user.list )


for user  in $userlist
do
user_a=$(grep -w "$user" /etc/passwd  | awk -F : '{print $1}' )
if
   # [ $user_a = $user ]
    [ ! $user_a -z ] && [ $user_a = $user ] 
    # To determine whether user_a is empty, not empty in to continue
then
    echo "The user $user is already exist."
else
    useradd $user #2>>/dev/null
    echo "User $user is added."
fi
done

方法二:

#new useradd.sh

#!/bin/bash
# Batch add user by scripts
# the new method

userlist=$( cat user.list )

for user in $userlist
do
    useradd $user 2>>/dev/null
    if
        [ $? -eq 0 ]
    then
        echo "123456" | passwd --stdin $user >> /dev/null
        echo "Useradd Success!"
    else
        echo "The user $user is already exists."
    fi
done

##################################

實戰:ping.sh #批量測試IP地址是否連通

 image
源碼如下:

#!/bin/bash

ip_list=$( cat ip.list )

for ip in $ip_list
do
    ping -w 3 -c 3 -i 0.2 $ip >>/dev/null
    if [ $? -eq 0 ]
        then echo "the $ip is up."
    else echo "the $ip is down."
    fi
done


免責聲明!

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



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