選擇結構讓程序更加智能
shell作為一種腳本語言,語法格式和一般編程語言比如C++語言很相似,然而在變量的格式上略有區(qū)別,需要經過一定的練習才可以熟練掌握。
程序如果逐條執(zhí)行,單純的將一些指令順序放到文件中,這就是順序結構。
這時程序的功能依然很有限,只可以處理簡單邏輯。而實際的需求是要根據當前情況進行判斷,進而給出結果。比如檢測當前主機與目標主機之間是否ping通,如果ping通輸出“可以ping通”,否則輸出“不可以ping通”,這就需要讓程序具備判斷的能力,而當下所謂的人工智能也是基于最基礎的判斷,讓程序在不同閾值下做出最優(yōu)選擇。
test命令
Shell中的 test 命令用于檢查某個條件是否成立,它可以進行數(shù)值、字符和文件三個方面的測試。
test命令用exit code返回結果,而不是使用stdout。0表示真,非0表示假。
數(shù)值測試:
參數(shù) |
說明 |
-eq |
等于則為真 |
-ne |
不等于則為真 |
-gt |
大于則為真 |
-ge |
大于等于則為真 |
-lt |
小于則為真 |
-le |
小于等于則為真 |
test也可以使用[]代替
字符串測試
參數(shù) |
說明 |
= |
等于則為真 |
!= |
不相等則為真 |
-z 字符串 |
字符串的長度為零則為真 |
-n 字符串 |
字符串的長度不為零則為真 |
文件測試
參數(shù) |
說明 |
-e 文件名 |
如果文件存在則為真 |
-r 文件名 |
如果文件存在且可讀則為真 |
-w 文件名 |
如果文件存在且可寫則為真 |
-x 文件名 |
如果文件存在且可執(zhí)行則為真 |
-s 文件名 |
如果文件存在且至少有一個字符則為真 |
-d 文件名 |
如果文件存在且為目錄則為真 |
-f 文件名 |
如果文件存在且為普通文件則為真 |
-c 文件名 |
如果文件存在且為字符型特殊文件則為真 |
-b 文件名 |
如果文件存在且為塊特殊文件則為真 |
邏輯運算符&&和||
&& 表示與,|| 表示或
二者具有短路原則:
expr1 && expr2:當expr1為假時,直接忽略expr2
expr1 || expr2:當expr1為真時,直接忽略expr2
表達式的exit code為0,表示真;為非零,表示假。
hioier@yunpc:~/scripts$ test -e test.sh && echo "exist" || echo "Not exist"
Not exist
if語句
單分支
if condition
then
command1
command2
...
commandN
fi
a=3
b=4
if [ $a -lt $b ] && [ $a -gt 2 ]
then
echo "YES"
fi
雙分支
if condition
then
command1
command2
...
commandN
else
command
fi
a=3
b=4
if [ $a -gt $b ] && [ $a -gt 2 ]
then
echo "YES"
else
echo "NO"
fi
多分支
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
另外,Shell 還提供了與( -a )、或( -o )、非( ! )三個邏輯操作符用于將測試條件連接起來,其優(yōu)先級為: ! 最高, -a 次之, -o 最低。
declare -i score=69
if test $score -ge 90 -a $score -le 100
then
echo "A"
elif test $score -ge 80 -a $score -lt 90
then
echo "B"
elif test $score -ge 60 -a $score -lt 80
then
echo "C"
else
echo "D"
fi
case語句
case ... esac 為多選擇語句,與其他語言中的 switch ... case 語句類似,是一種多分支選擇結構,每個 case 分支用右圓括號開始,用兩個分號 ;; 表示 break,即執(zhí)行結束,跳出整個 case ... esac 語句,esac(就是 case 反過來)作為結束標記。
可以用 case 語句匹配一個值與一個模式,如果匹配成功,執(zhí)行相匹配的命令。
case ... esac 語法格式如下:
case $變量名稱 in
值1)
command1
command2
...
commandN
;; # 類似于C/C++中的break
值2)
command1
command2
...
commandN
...
;;
*) # 類似于C/C++中的default
command1
command2
...
commandN
...
;;
esac
declare -i n
read -p "請輸入1-4之間的數(shù)字:" n
case $n in
1) echo "選擇1"
;;
2) echo "選擇2"
;;
3) echo "選擇3"
;;
4) echo "選擇4"
;;
*) echo "請輸入正確的數(shù)字"
;;
esac