Linux的shell編程前奏之基礎技能實戰二

                                                                                        Linux的shell編程前奏之基礎技能實戰二

一>監控WEB服務狀態,如果訪問兩次均失敗,則報警(let應用案例)。

CheckUrl(){
        timeout=5
        fails=0
        success=0
        while true
         do
          wget --timeout=$timeout --tries=1 http://oldboy.blog.51cto.com -q -o /dev/null
          if [ $? -ne 0 ]
                then
                        let fails=fails+1
          else
                let success+=1
          fi
          if [ $success -ge 1 ]
            then 
                        echo success
                        exit 0
          fi
          if [ $fails -ge 2 ]
                then 
                        Critical="sys is down"
                        echo $Critical|tee|mail -s "$Critical" [email protected]
                        exit 2
          fi
        done
}
CheckUrl

運行:

[root@lll 2019-02-05]# sh -x 2019-02-05checkurl.sh 
+ CheckUrl
+ timeout=5
+ fails=0
+ success=0
+ true
+ wget --timeout=5 --tries=1 http://oldboy.blog.51cto.com -q -o /dev/null
+ '[' 0 -ne 0 ']'
+ let success+=1
+ '[' 1 -ge 1 ']'
+ echo success
success
+ exit 0

總結:

1>let 運算命令的語法格式爲:let 賦值表達式      let賦值表達式的功能等同於"((賦值表達式))"

2>數字之間的判定:

-ne爲"不等於",-ge爲"大於等於",le爲“小於等於”

-eqequal

-nenot equal

-gtgreater than

-ltless than

-gegreater than or equal

-leless than or equal

3>多重條件的判定:

-a兩個條件同時成立,eg:test -r file a test -x file,同時成立返回true

-o任何一個條件成立,eg:test -r file o test -x file,同時成立返回true

反向狀態,如test!-x file,當file不具有x時,返回true

4>tee命令主要被用來向standout(標準輸出流,通常是命令執行窗口)輸出的同時也將內容輸出到文件,ping baidu.com | tee -a ping-baidu.log

5>mail -s test [email protected]

這條命令的結果是發一封標題爲test的空信給後面的郵箱,如果你有mta並且後面的郵箱不會擋這種可能莫名奇妙的信的時候,就能收到這封信了。如果你不想被這種亂七八糟的事情干擾,後面的郵箱請使用本地帳戶。



二>開發shell腳本,分別實現以腳本傳參和read讀入的方式比較兩個整數的大小。用條件表達式(禁止用if)進行判斷並以屏幕輸出的方式提醒用戶比較的結果。

注意:一共是開發兩個腳本。在用腳本傳參和read讀入的方式實現時,需要對變量是否爲數字及傳參個數是否正確給予提示。

方案一:採用read方法

#!/bin/sh
read -p "please input two num:" a b
if [ -z "$a" ] || [ -z "$b" ] &&{#如果$a變量長度爲0或者$b長度爲零,即任何一個變量爲空,則執行命令
echo "please input two num again"
exit 1   #以返回值1退出腳本
}
expr $a + 10 &>/dev/null   #判斷$a是否爲整數,不輸出任何信息(&>)
RETVAL1=$?
expr $b + 10 &>/dev/null
RETVAL2=$?
test $RETVAL1 -eq 0 a $RETVAL2 -eq 0 ||{
echo "please input two number again"
exit 2
}
[ $a -lt $b] && {
echo "$a<$b"
exit 0
}
[ $a -eq $b] && {
echo "$a=$b"
exit 0
}
[ $a -gt $b] && {
echo "$a>$b"

}

總結:

1>shell進程中的特殊狀態變量$?判斷進程是否執行成功。

2>shell之獲取用戶輸入的命令read,相當於java中的Scanner類。類比和模仿思維非常重要。用戶模仿系統腳本。公司中的新人模仿老師傅的技能。

3>利用以expr做計算時變量或字符串必須是整數的規則,將一個位未知的變量和一個已知的整數相加,返回值爲零則認爲做加法的變量爲整數。

在使用expr時間,要注意:

運算符及用於計算的數字左右都至少有一個空格,否則會報錯;

使用乘號時,必須用反斜線屏蔽其特定含義,因爲shell可能會誤解星號的含義。


方案二:通過命令行傳參的方式實現

#!/bin/sh
a=$1
b=$2
[ $# -ne 2 ] &&{
echo "USAGE:$0 NUM1 NUM2"
exit 1 #以返回值1退出腳本
}
expr $a + 10 &>/dev/null
RETVAL1=$?
expr $b + 10 &>/dev/null
RETVAL2=$?
test $RETVAL1 -eq 0 a $RETVAL2 -eq 0 ||{
echo "please input two number again"
exit 2
}
[ $a -lt $b] && {
echo "$a<$b"
exit 0
}
[ $a -eq $b] && {
echo "$a=$b"
exit 0
}
[ $a -gt $b] && {
echo "$a>$b"
}

總結:

1>shell中的特殊位置參數變量:

$0  獲取當前執行的shell腳本的文件名,如果執行腳本包含了路徑,那麼就包括腳本路徑。

$n  獲取當前執行的shell腳本的第n個參數值。

$#  獲取當前執行的shell腳本後面接的參數的總個數。

2>shell進程中的特殊狀態變量:

$?獲取執行上一個指令的執行狀態返回值(0爲成功,非零爲失敗)

$$獲取當前執行的shell腳本的進程號。

$!獲取上一個在後臺工作的進程的進程號。


















































 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章