shell 知識點補充(5)-case . in .esac/function/while done/until done

來源:互聯網
上載者:User

1、case ... in .... esac

case ... in .... esac ,他的文法如下:
case $變數名稱 in
"第一個變數內容")
程式段
;;
"第二個變數內容")
程式段
;;
*)
不包含第一個變數內容與第二個變數內容的其它程式執行段
exit 1
;;
esac
要注意的是,這個文法是以 case 為開頭,而以 esac 為結尾,

寫個程式:讓使用者能夠輸入 one, two, three , 並且將使用者的變數顯示到螢幕上,如果不是 one, two, three 時,就告知使用者僅有這三種選擇。
[root@linux scripts]# vi sh11.sh
#!/bin/bash
# Program:
# Let user input one, two, three and show in screen.
# History:
# 2005/08/29 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "This program will print your selection !"
# read -p "Input your choice: " choice
# case $choice in
case $1 in
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is THREE"
;;
*)
echo "Usage {one|two|three}"
;;
esac
此時,您可以使用『 sh sh11.sh two 』的方式來下達指令,就可以收到相對應的響應了。 上面使用的是直接下達的方式,而如果使用的是互動式時,那麼將上面第 10, 11 行的 "#" 拿掉, 並將 12 行加上批註 (#)

實練:

1 #!/bin/bash
  2
  3
  4 echo "practise to use "one" "two" "three""
  5 read -p "input your choise (from the up suggest):" answer
  6
  7 case "$answer" in
  8         "one")
  9         echo "your input is 'one', that is $answer"
 10         ;;
 11         "two")
 12         echo "your input is 'two', that is $answer"
 13         ;;
 14         "three")
 15         echo "your input is 'three', that is $answer"
 16         ;;
 17 *)
 18 echo "$answer is wrong,{you only have the hinted  three choices}"
 19 ;;
 20 esac

Loong:/home/yee/shell# sh case_practise.sh
practise to use one two three
input your choise (from the up suggest):one
your input is 'one', that is one
Loong:/home/yee/shell# sh case_practise.sh
practise to use one two three
input your choise (from the up suggest):two
your input is 'two', that is two
Loong:/home/yee/shell# sh case_practise.sh
practise to use one two three
input your choise (from the up suggest):three
your input is 'three', that is three
Loong:/home/yee/shell# sh case_practise.sh
practise to use one two three
input your choise (from the up suggest):xxxx
xxxx is wrong,{you only have the hinted  three choices}
Loong:/home/yee/shell#

2、function

function 也是擁有內建變數的~他的內建變數與 shell script 很類似, 函數名稱代表示 $0 ,而後續接的變數也是以 $1, $2... 來取代的~ 這裡很容易搞錯喔~因為『 function fname() { 程式段 } 』內的 $0, $1... 等等與 shell script 的 $0 是不同的。以上面 sh11-2.sh 來說,假如我下達:『 sh sh11-2.sh one 』 這表示在 shell script 內的 $1 為 "one" 這個字串。但是在 printit()
內的 $1 則與這個 one 無關。 我們將上面的例子再次的改寫一下,讓您更清楚!
[root@linux scripts]# vi sh11-3.sh
#!/bin/bash
# Program:
# Let user input one, two, three and show in screen.
# History:
# 2005/08/29 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
echo "Your choice is $1"
}
echo "This program will print your selection !"
case $1 in
"one")
printit 1
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage {one|two|three}"
;;
esac
在上面的例子當中,如果您輸入『 sh sh11-3.sh one 』就會出現『 Your choice is 1 』的字樣~ 為什麼是 1 呢?因為在程式段落當中,我們是寫了『 printit 1 』那個 1 就會成為 function 當中的 $1

3、while done/until done

while do done, until do done
一般來說,迴圈最常見的就是底下這兩種狀態了:
while [ condition ]
do
程式段落
done
這種方式中, while 是『當....時』,所以,這種方式說的是『當 condition 條件成立時,就進行迴圈,直到 condition 的條件不成立才停止』的意思。
until [ condition ]
do
程式段落
done
這種方式恰恰與 while 相反,它說的是『當 condition 條件成立時,就終止迴圈, 否則就持續進行迴圈的程式段。』

如果我想要計算 1+2+3+....+100 這個資料呢? 利用迴圈啊~他是這樣的:
[root@linux scripts]# vi sh13.sh
#!/bin/bash
# Program:
# Try to use loop to calculate the result "1+2+3...+100"
# History:
# 2005/08/29 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
s=0
i=0
while [ "$i" != "100" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "The result of '1+2+3+...+100' is ==> $s"
嘿嘿!當您執行了『 sh sh13.sh 』之後,就可以得到 5050 這個資料才對啊!這樣瞭呼~ 那麼讓您自行做一下,如果想要讓使用者自行輸入一個數字,讓程式由 1+2+... 直到您輸入的數字為止, 該如何撰寫呢?

實練:

版本一:while done

1 #!/bin/bash
  2
  3 read -p "please input the stop number:" input
  4 s=0
  5 i=0
  6 while [ "$i" != "$input" ]
  7 do
  8         i=$(($i+1));# echo "i=$i"
  9         s=$(($s+$i));# echo "s=$s"
 10 done
 11 echo "the result is: $s"

Loong:/home/yee/shell# sh self_add.sh
please input the stop number:100
the result is: 5050
Loong:/home/yee/shell#

版本二:until done

  1 #!/bin/bash
  2
  3 read -p "please input the stop number:" input
  4 s=0
  5 i=0
  6 until [ "$i" =
"$input" ]                                 #只需修改兩個地方即可。
  7 do
  8         i=$(($i+1));# echo "i=$i"
  9         s=$(($s+$i));# echo "s=$s"
 10 done
 11 echo "the result is: $s"
~                           
please input the stop number:50
the result is: 1275
Loong:/home/yee/shell# sh self_add2.sh
please input the stop number:100
the result is: 5050
Loong:/home/yee/shell# sh self_add2.sh
please input the stop number:4
the result is: 10
Loong:/home/yee/shell#

4、for...do....done

for 這種文法,則是『 已經知道要進行幾次迴圈』的狀態!他的文法是:
for (( 初始值; 限制值; 執行步階 ))
do
程式段
done
這種文法適合於數值方式的運算當中,在 for 後面的括弧內的三串內容意義為:
• 初始值:某個變數在迴圈當中的起始值,直接以類似 i=1 設定好;
• 限制值:當變數的值在這個限制值的範圍內,就繼續進行迴圈。例如 i<=100;
• 執行步階:每作一次迴圈時,變數的變化量。例如 i=i+1。
值得注意的是,在『執行步階』的設定上,如果每次增加 1 ,則可以使用類似『i++』的方式,亦即是 i 每次迴圈都會增加一的意思。好,我們以這種方式來進行 1 累加到 100 的迴圈吧!
[root@linux scripts]# vi sh14.sh
#!/bin/bash
# Program:
# Try do calculate 1+2+....+100
# History:
# 2005/08/29 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
s=0
for (( i=1; i<=100; i=i+1 ))
do
s=$(($s+$i))
done
echo "The result of '1+2+3+...+100' is==> $s"

還可以利用底下的方式來進行非數字方面的迴圈運作喔!
for var in con1 con2 con3 ...
do
程式段
done
以上面的例子來說,這個 $var 的變數內容在迴圈工作時:
1. 第一次迴圈時, $var 的內容為 con1 ;
2. 第二次迴圈時, $var 的內容為 con2 ;
3. 第三次迴圈時, $var 的內容為 con3 ;
4. ....
我們可以做個簡單的練習。假設我有三種動物,分別是 dog, cat, elephant 三種, 我想每一行都輸出這樣:『There are dogs...』之類的字樣,則可以:
[root@linux scripts]# vi sh15.sh
#!/bin/bash
# Program:
# Using for .... loop to print 3 animal
# History:
# 2005/08/29 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for animal in dog cat elephant
do
echo "There are ""$animal""s.... "
done

另外,依次測試目錄可以如下方式:

filelist=`ls $dir`
for filename in $filelist
do
perm=""
test -r "$dir/$filename" && perm="$perm readable"
test -w "$dir/$filename" && perm="$perm writable"
test -x "$dir/$filename" && perm="$perm executable"
echo "The file $dir/$filename's permission is $perm "
done

5、shell script 的追蹤與 debug

[root@linux ~]# sh [-nvx] scripts.sh
參數:
-n :不要執行 script,僅查詢文法的問題;
-v :再執行 sccript 前,先將 scripts 的內容輸出到螢幕上;
-x :將使用到的 script 內容顯示到螢幕上,這是很有用的參數!
範例:
範例一:測試 sh16.sh 有無文法的問題?
[root@linux ~]# sh -n sh16.sh
# 若文法沒有問題,則不會顯示任何資訊!
範例二:將 sh15.sh 的執行過程全部列出來~
[root@linux ~]# sh -x sh15.sh
+ PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/vbird/bin
+ export PATH
+ for animal in dog cat elephant
+ echo 'There are dogs.... '
There are dogs....
+ for animal in dog cat elephant
+ echo 'There are cats.... '
There are cats....
+ for animal in dog cat elephant
+ echo 'There are elephants.... '
There are elephants....
# 使用 -x 真的是追蹤 script 的好方法,他可以將所有有執行的程式段在執行前列出來,
# 如果是程式段落,則輸出時,最前面會加上 + 字型大小,表示他是程式碼而已,
# 實際的輸出則與 standard output 有關啊~如上所示。
在上面的範例二當中,我們可以透過這個簡單的參數 -x 來達成 debug 的目的,這可是一個不可多得的參數, 通常如果您執行 script 卻發生問題時,利用這個 -x 參數,就可以知道問題是發生在哪一行上面了!

摘自 《鳥哥的私房菜》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.