說到shell程式設計之前,先介紹變量,變量在shell程式設計中是很重要。變量無非就是一堆可變化的值。
變量的的聲明遵循以下幾條規則:
一,不能跟系統中的變量名重名。如PATH是系統變量,在聲明時不要也用PATH當作變量名。
二,不能以數字開關,12USER=bingo這是錯誤的,最前面不是數字的話,就認為合法,當然變量名隻有二種情況,要麼全部是英文,要麼是英文跟數字組合。等号的兩邊不能有空格,USERNAME= bingo這種情況聲明的USERNAME是空值,且會把bingo當作指令來執行 ,USERNAME = bingo 這種情況會USERNAME當作指令來執行 ,USERNAME =bingo這種情況會USERNAME當作指令來執行。
三,變量内容沒有限制,如果變量内容裡還有變量,則必須用雙引号,不能會出現變量無法替換,如果變量内容有特殊字元則需用\這個跳脫字元将它原來的意義給注釋掉,使它變成一個普通的字元來使用。
四,取消變量用unset,如unset USERNAME.
對變量做基本的介紹下面介紹三種條件測試
(1) test expresstion :用于檢查檔案與比較有效值
(2) [ expreesstion ](判斷符号):與test作用一樣,在腳本中這種寫法很常見
(3) ` expresstion `:一般判斷常數之間的大小
(4)指令執行有兩種狀态:一種叫做指令執行的結果,一種是指令執行結果的狀态傳回值,
<a href="http://blog.51cto.com/attachment/201206/175023548.jpg" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201206/175449726.jpg" target="_blank"></a>
(5)指令的引用兩種方式``與$(): echo “kernel-`uname -r`" 與echo "kernel-$(uname -r)”。(``反單号,在esc鍵的下面)效果都一樣
(6)算術運算:sum=$(($var1+$var2))與sum=$[$var1+$var2]效果一樣
(7)位置參數:執行腳本為$0這個變量,第一個接的參數是$1,第二個是$2,依次累推
<a href="http://blog.51cto.com/attachment/201206/195028509.jpg" target="_blank"></a>
下面介紹if的用法。if 用于條件判斷。
1, if 條件測試 ;then
語句...
fi (表示結束if語句)
(1) if test 2 -lt 3;then
echo "this is right."
fi
(2)if [ 2 -lt 3 ];then (注意要與[ ]之間有空格
echo "this is right"
fi
(3) if [[ 2<3 ]];then
echo “this is right”
fi
2,if 條件測試;then(如果條件測試傳回的值為真,則執行語句一,否則執行語句二)
語句一....
else
語句二....
(1)if [ 4 -lt 3 ];then
echo "this is right."
else
echo "this is wrong."
fi
(2) if id root &> /dev/null;then(if後面可以寫指令,&> /dev/null把id指令執行的執行結果輸入到/dev/null,可把/dev/null當作黑洞,永遠都填不滿)
echo "user exist."
else
echo "user not exist."
3, if 條件測試1;then
語句一...
elif 條件測試2;then (elif可以有多個)
語句二...
語句三...
read -p “please input (y/n):." yn(提示使用者輸入y/n,并将值存儲在變量yn中)
if [ "$yn" = "y" -o "$yn" == "Y" ];then
echo "ok,continue"
elif [ "$yn"= "n" -o "$yn"="N" ];then
echo "break."
echo "input error."
4, case常用于變量的值有多種的時候
case 變量名 in
"第一個變量内容")
語句1....
"第二變量内容”)
語句2....
*) (*表示既不是第一個變量内容也不是第二變量内容)
語句3.....
esac
case "$1" in($1是位置參數,
start)
service network start;;
stop)
service network stop;;
reload)
sevice network reload;;
restart)
service network restart;;
*)
echo "Usage: `basename $0` {start|stop|reload|restart}";;
5,for循環,一般用于知道要循環幾次。
for 變量名 in 變量值 ;do
語句1....
done
sum=0
for i in `seq 1 100`;do(seq 是表示從1到100都循環一次,加``表示先執行seq,得到seq命執行結果)
sum=$(($i+$sum))
let i++ (讓變量自動加1)
echo "total $sum."
6,while 循環用于變量值不固定的時
while 條件判斷;do(條件滿足時就循環)
語句...
計算從1到100偶數之和
i=0
while [ $i -le 100 ];do
sum=$(($sum+$i))
let i+=2
echo "total $sum"
7,until 循環正好與while相反,當條件不滿足時循環
until 條件判斷 do;
語句
until [ $i -ge 100 ];do
sum=$(($sum+$i)
let i++
8,function(函數):簡單來說實作代碼重複調用。遵循先定義後調用
定義函數兩種方式
(1)function fname {
語句.....
}(function 是關鍵字,fname是函數名
(2) fname () {
語句...
}
FUSER () {
if id $1 &> /dev/null;then
echo "user uid: `id -u $1`,user shell:`grep "^$1\>:" /etc/passwd`
esle
echo "no this user."
}(定義了一個FUSER是函數名,大小寫都無所謂)
read -p "input user:" USERNAME
while [ "$USERNAME" != "quit" ];do
FUSER $USERNAME(給函數傳遞參數也就是$1)
read -p "next user:" USERNAME
done
9, continue:退出目前這一次循環,提前進入下一次循環
i=0
sum=0
if [ $[$%2] -eq 1 ];then
let i++
continue (如果i是奇數,則又從while開始循環)
fi
let sum=$(($sum+$i))
echo "even total: $sum"
10, break: 中斷目前循環
read -p "input username:" UNAME
while true;do(true表示不用做判斷,開始循環)
if id $UNAME &> /dev/null;then
echo “user uid: `id -u $UNAME &> /dev/null`
echo "no a user: $UNAME."
fi
read -p "n|N for next user,others for quitting."choice
case $choice in
n|N)
read -p "a username:" UNAME;;
*)
break ;;(中止循環,并退出)
esac
done
本文轉自 deng304749970 51CTO部落格,原文連結:http://blog.51cto.com/damondeng/900301,如需轉載請自行聯系原作者