Linux的shell編程前奏之基礎技能實戰二java
一>監控WEB服務狀態,若是訪問兩次均失敗,則報警(let應用案例)。shell
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" 850034044@qq.com 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
總結:bash
1>let 運算命令的語法格式爲:let 賦值表達式 let賦值表達式的功能等同於"((賦值表達式))"less
2>數字之間的斷定:ide
-ne爲"不等於",-ge爲"大於等於",le爲「小於等於」url
-eqequalspa
-nenot equal命令行
-gtgreater thanblog
-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 admin@aispider.com
這條命令的結果是發一封標題爲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腳本的進程號。
$!獲取上一個在後臺工做的進程的進程號。