亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
打印 上一主題 下一主題

[學(xué)習(xí)共享] shell 十三問(wèn)? [復(fù)制鏈接]

論壇徽章:
0
71 [報(bào)告]
發(fā)表于 2004-01-23 15:12 |只看該作者

shell 十三問(wèn)?

看來(lái)臺(tái)灣人的解釋更加簡(jiǎn)潔,易懂

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
72 [報(bào)告]
發(fā)表于 2004-01-30 12:57 |只看該作者

shell 十三問(wèn)?

一口氣又從頭到尾看了一邊,深有感觸!
強(qiáng)烈推薦喜歡shell的朋友多多研讀,仔細(xì)品味!

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
73 [報(bào)告]
發(fā)表于 2004-01-31 17:20 |只看該作者

shell 十三問(wèn)?

12) 你要 if 還是 case 呢?

放了一個(gè)愉快的春節(jié)假期,人也變得懶懶散散的... 只是,答應(yīng)了大家的作業(yè),還是要堅(jiān)持完成就是了~~~

還記得我們?cè)诘?10 章所介紹的 return value 嗎?
是的,接下來(lái)介紹的內(nèi)容與之有關(guān),若你的記憶也被假期的歡樂(lè)時(shí)光所抵消掉的話,
那,建議您還是先回去溫習(xí)溫習(xí)再回來(lái)...

若你記得  return value ,我想你也應(yīng)該記得了 && 與 || 是甚麼意思吧?
用這兩個(gè)符號(hào)再配搭 command group 的話,我們可讓 shell script 變得更加聰明哦。
比方說(shuō):
  1. comd1 && {
  2.     comd2
  3.     comd3
  4.     :
  5. } || {
  6.     comd4
  7.     comd5
  8. }
復(fù)制代碼

意思是說(shuō):
    假如 comd1 的 return value 為 true 的話,
    然則執(zhí)行 comd2 與 comd3 ,
    否則執(zhí)行 comd4 與 comd5 。


事實(shí)上,我們?cè)趯?xiě) shell script 的時(shí)候,經(jīng)常需要用到這樣那樣的條件以作出不同的處理動(dòng)作。
用 && 與 || 的確可以達(dá)成條件執(zhí)行的效果,然而,從"人類語(yǔ)言"上來(lái)理解,卻不是那麼直觀。
更多時(shí)候,我們還是喜歡用 if .... then ... else ... 這樣的 keyword 來(lái)表達(dá)條件執(zhí)行。
在 bash shell 中,我們可以如此修改上一段代碼:
  1. if comd1
  2. then
  3.     comd2
  4.     comd3
  5. else
  6.     comd4
  7.     comd5
  8. fi
復(fù)制代碼

這也是我們?cè)?shell script 中最常用到的 if 判斷式:
    只要 if 後面的 command line 返回 true 的 return value (我們最常用 test 命令來(lái)送出 return value),
    然則就執(zhí)行 then 後面的命令,否則執(zhí)行  else 後的命令﹔fi 則是用來(lái)結(jié)束判斷式的 keyword 。


在 if 判斷式中,else 部份可以不用,但 then 是必需的。
(若 then 後不想跑任何 command ,可用" : " 這個(gè) null command 代替)。
當(dāng)然,then 或 else 後面,也可以再使用更進(jìn)一層的條件判斷式,這在 shell script 設(shè)計(jì)上很常見(jiàn)。
若有多項(xiàng)條件需要"依序"進(jìn)行判斷的話,那我們則可使用 elif 這樣的 keyword :
  1. if comd1; then
  2.     comd2
  3. elif comd3; then
  4.     comd4
  5. else
  6.     comd5
  7. fi
復(fù)制代碼

意思是說(shuō):
    若 comd1 為 true ,然則執(zhí)行 comd2 ﹔
    否則再測(cè)試 comd3 ,然則執(zhí)行 comd4 ﹔
    倘若 comd1 與 comd3 均不成立,那就執(zhí)行 comd5 。


if 判斷式的例子很常見(jiàn),你可從很多 shell script 中看得到,我這裡就不再舉例子了...

接下來(lái)要為大家介紹的是 case 判斷式。
雖然 if 判斷式已可應(yīng)付大部份的條件執(zhí)行了,然而,在某些場(chǎng)合中,卻不夠靈活,
尤其是在 string 式樣的判斷上,比方如下:
  1. QQ () {
  2.     echo -n "Do you want to continue? (Yes/No): "
  3.     read YN
  4.     if [ "$YN" = Y -o "$YN" = y -o "$YN" = "Yes" -o "$YN" = "yes" -o "$YN" = "YES" ]
  5.     then
  6.         QQ
  7.     else
  8.         exit 0
  9.     fi
  10. }
  11. QQ
復(fù)制代碼

從例中,我們看得出來(lái),最麻煩的部份是在於判斷 YN 的值可能有好幾種式樣。
聰明的你或許會(huì)如此修改:
  1. ...
  2. if echo "$YN" | grep -q '^[Yy]\([Ee][Ss]\)*$'
  3. ...
復(fù)制代碼

也就是用 Regular Expression 來(lái)簡(jiǎn)化代碼。(我們有機(jī)會(huì)再來(lái)介紹 RE)
只是... 是否有其它更方便的方法呢?
有的,就是用 case 判斷式即可:
  1. QQ () {
  2.     echo -n "Do you want to continue? (Yes/No): "
  3.     read YN
  4.    case "$YN" in
  5.         [Yy]|[Yy][Ee][Ss])
  6.             QQ
  7.             ;;
  8.         *)
  9.             exit 0
  10.             ;;
  11.     esac
  12. }
  13. QQ
復(fù)制代碼

我們常用 case 的判斷式來(lái)判斷某一變量在不同的值(通常是 string)時(shí)作出不同的處理,
比方說(shuō),判斷 script 參數(shù)以執(zhí)行不同的命令。
若你有興趣、且用 Linux 系統(tǒng)的話,不妨挖一挖 /etc/init.d/* 裡那堆 script 中的  case 用法。
如下就是一例:
  1. case "$1" in
  2.   start)
  3.         start
  4.         ;;
  5.   stop)
  6.         stop
  7.         ;;
  8.   status)
  9.         rhstatus
  10.         ;;
  11.   restart|reload)
  12.         restart
  13.         ;;
  14.   condrestart)
  15.         [ -f /var/lock/subsys/syslog ] && restart || :
  16.         ;;
  17.   *)
  18.         echo $"Usage: $0 {start|stop|status|restart|condrestart}"
  19.         exit 1
  20. esac
復(fù)制代碼

(若你對(duì) positional parameter 的印像已經(jīng)模糊了,請(qǐng)重看第 9 章吧。)

okay,十三問(wèn)還剩一問(wèn)而已,過(guò)幾天再來(lái)搞定之....  ^_^

[ 本帖最后由 網(wǎng)中人 于 2008-10-30 02:25 編輯 ]

論壇徽章:
0
74 [報(bào)告]
發(fā)表于 2004-02-01 15:10 |只看該作者

shell 十三問(wèn)?

講的很透徹,support!

論壇徽章:
0
75 [報(bào)告]
發(fā)表于 2004-02-02 14:59 |只看該作者

shell 十三問(wèn)?

向他們學(xué)習(xí)

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
76 [報(bào)告]
發(fā)表于 2004-02-03 17:27 |只看該作者

shell 十三問(wèn)?

13) for what?  while 與 until 差在哪?

終於,來(lái)到 shell 十三問(wèn)的最後一問(wèn)了...  長(zhǎng)長(zhǎng)吐一口氣~~~~

最後要介紹的是 shell script 設(shè)計(jì)中常見(jiàn)的"循環(huán)"(loop)。
所謂的 loop 就是 script 中的一段在一定條件下反覆執(zhí)行的代碼。
bash shell  中常用的 loop 有如下三種:
* for
* while
* until

for loop 是從一個(gè)清單列表中讀進(jìn)變量值,並"依次"的循環(huán)執(zhí)行 do 到 done 之間的命令行。
例:
  1. for var in one two three four five
  2. do
  3.     echo -----------
  4.     echo '$var is '$var
  5.     echo
  6. done
復(fù)制代碼

上例的執(zhí)行結(jié)果將會(huì)是:
    1) for 會(huì)定義一個(gè)叫 var 的變量,其值依次是 one two three four five 。
    2) 因?yàn)橛?5 個(gè)變量值,因此 do 與 done 之間的命令行會(huì)被循環(huán)執(zhí)行 5 次。
    3) 每次循環(huán)均用 echo 產(chǎn)生三行句子。
         而第二行中不在 hard quote 之內(nèi)的 $var 會(huì)依次被替換為 one two three four five 。
    4) 當(dāng)最後一個(gè)變量值處理完畢,循環(huán)結(jié)束。


我們不難看出,在  for loop 中,變量值的多寡,決定循環(huán)的次數(shù)。
然而,變量在循環(huán)中是否使用則不一定,得視設(shè)計(jì)需求而定。
倘若 for loop 沒(méi)有使用 in 這個(gè) keyword 來(lái)指定變量值清單的話,其值將從 $@ (或 $* )中繼承:
  1. for var; do
  2.     ....
  3. done
復(fù)制代碼

(若你忘記了 positional parameter ,請(qǐng)溫習(xí)第 9 章...)

for loop 用於處理"清單"(list)項(xiàng)目非常方便,
其清單除了可明確指定或從 positional parameter 取得之外,
也可從變量替換或命令替換取得... (再一次提醒:別忘了命令行的"重組"特性﹗)
然而,對(duì)於一些"累計(jì)變化"的項(xiàng)目(如整數(shù)加減),for 亦能處理:
  1. for ((i=1;i<=10;i++))
  2. do
  3.    echo "num is $i"
  4. done
復(fù)制代碼


除了 for loop ,上面的例子我們也可改用  while loop 來(lái)做到:
  1. num=1
  2. while [ "$num" -le 10 ]; do
  3.     echo "num is $num"
  4.     num=$(($num + 1))
  5. done
復(fù)制代碼


while loop 的原理與 for loop 稍有不同:
它不是逐次處理清單中的變量值,而是取決於 while 後面的命令行之 return value :
* 若為 ture ,則執(zhí)行 do 與 done 之間的命令,然後重新判斷 while 後的 return value 。
* 若為 false ,則不再執(zhí)行 do 與 done 之間的命令而結(jié)束循環(huán)。

分析上例:
    1) 在 while 之前,定義變量 num=1 。
    2) 然後測(cè)試(test) $num 是否小於或等於 10 。
    3) 結(jié)果為 true ,於是執(zhí)行 echo 並將 num 的值加一。
    4) 再作第二輪測(cè)試,此時(shí) num 的值為 1+1=2 ,依然小於或等於 10,因此為  true ,繼續(xù)循環(huán)。
    5) 直到 num 為 10+1=11 時(shí),測(cè)試才會(huì)失敗... 於是結(jié)束循環(huán)。


我們不難發(fā)現(xiàn):
* 若 while 的測(cè)試結(jié)果永遠(yuǎn)為 true 的話,那循環(huán)將一直永久執(zhí)行下去:
  1. while :; do
  2.     echo looping...
  3. done
復(fù)制代碼

上例的" : "是 bash 的 null command ,不做任何動(dòng)作,除了送回 true 的 return value 。
因此這個(gè)循環(huán)不會(huì)結(jié)束,稱作死循環(huán)。
死循環(huán)的產(chǎn)生有可能是故意設(shè)計(jì)的(如跑 daemon),也可能是設(shè)計(jì)錯(cuò)誤。
若要結(jié)束死尋環(huán),可透過(guò) signal 來(lái)終止(如按下 ctrl-c )。
(關(guān)於 process 與 signal ,等日後有機(jī)會(huì)再補(bǔ)充,十三問(wèn)暫時(shí)略過(guò)。)

一旦你能夠理解 while loop 的話,那,就能理解 until loop :
* 與 while 相反,until 是在 return value 為 false 時(shí)進(jìn)入循環(huán),否則結(jié)束。
因此,前面的例子我們也可以輕鬆的用  until 來(lái)寫(xiě):
  1. num=1
  2. until [ ! "$num" -le 10 ]; do
  3.     echo "num is $num"
  4.     num=$(($num + 1))
  5. done
復(fù)制代碼

或是:
  1. num=1
  2. until [ "$num" -gt 10 ]; do
  3.     echo "num is $num"
  4.     num=$(($num + 1))
  5. done
復(fù)制代碼


okay ,關(guān)於 bash 的三個(gè)常用的 loop 暫時(shí)介紹到這裡。
在結(jié)束本章之前,再跟大家補(bǔ)充兩個(gè)與 loop 有關(guān)的命令:
*  break
* continue
這兩個(gè)命令常用在複合式循環(huán)裡,也就是在 do ... done 之間又有更進(jìn)一層的 loop ,
當(dāng)然,用在單一循環(huán)中也未嘗不可啦...  ^_^

break 是用來(lái)打斷循環(huán),也就是"強(qiáng)迫結(jié)束" 循環(huán)。
若 break 後面指定一個(gè)數(shù)值 n 的話,則"從裡向外"打斷第 n 個(gè)循環(huán),
預(yù)設(shè)值為 break 1 ,也就是打斷當(dāng)前的循環(huán)。
在使用 break 時(shí)需要注意的是, 它與 return 及 exit 是不同的:
* break 是結(jié)束 loop
* return 是結(jié)束 function
* exit 是結(jié)束 script/shell

而 continue 則與 break 相反:強(qiáng)迫進(jìn)入下一次循環(huán)動(dòng)作。
若你理解不來(lái)的話,那你可簡(jiǎn)單的看成:在 continue 到 done 之間的句子略過(guò)而返回循環(huán)頂端...
與 break 相同的是:continue 後面也可指定一個(gè)數(shù)值 n ,以決定繼續(xù)哪一層(從裡向外計(jì)算)的循環(huán),
預(yù)設(shè)值為 continue 1 ,也就是繼續(xù)當(dāng)前的循環(huán)。

在 shell script 設(shè)計(jì)中,若能善用 loop ,將能大幅度提高 script 在複雜條件下的處理能力。
請(qǐng)多加練習(xí)吧....


-----------

好了,該是到了結(jié)束的時(shí)候了。
婆婆媽媽的跟大家囉唆了一堆關(guān)於 shell 的基礎(chǔ)概念,
目的不是要告訴大家"答案",而是要帶給大家"啟發(fā)"...
在日後關(guān)於 shell 的討論中,我或許會(huì)經(jīng)常用"鏈接"方式指引回來(lái)十三問(wèn)中的內(nèi)容,
以便我們?cè)谶M(jìn)行技術(shù)探討時(shí)彼此能有一些討論基礎(chǔ),而不至於各說(shuō)各話、徒費(fèi)時(shí)力。
但,更希望十三問(wèn)能帶給你更多的思考與樂(lè)趣,至為重要的是透過(guò)實(shí)作來(lái)加深理解。

是的,我很重視"實(shí)作"與"獨(dú)立思考"這兩項(xiàng)學(xué)習(xí)要素,若你能夠掌握其中真義,那請(qǐng)容我說(shuō)聲:
--- 恭喜﹗十三問(wèn)你沒(méi)白看了﹗  ^_^


p.s.
至於補(bǔ)充問(wèn)題部份,我暫時(shí)不寫(xiě)了。而是希望:
1) 大家擴(kuò)充題目。
2) 一起來(lái)寫(xiě)心得。

Good luck and happy studying!

[ 本帖最后由 網(wǎng)中人 于 2008-10-30 02:26 編輯 ]

論壇徽章:
0
77 [報(bào)告]
發(fā)表于 2004-02-05 14:54 |只看該作者

shell 十三問(wèn)?

good article & thx a lot

論壇徽章:
0
78 [報(bào)告]
發(fā)表于 2004-02-05 22:38 |只看該作者

shell 十三問(wèn)?

真是太好了,十分精辟。只是我有一問(wèn)。
for ((i=1;i<=10;i++))
do
   echo "num is $i"
done
這個(gè)例子好像不行啊。我用bash和sh執(zhí)行都不行。
用bash的錯(cuò)誤提示是:
mfor: line 1: syntax error near unexpected token `(('
mfor: line 1: `for ((i=1;i<=10;i++)) '
用sh的錯(cuò)誤提示是:
mfor: syntax error at line 1: `(' unexpected
還請(qǐng)指點(diǎn)一下。

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
79 [報(bào)告]
發(fā)表于 2004-02-06 00:01 |只看該作者

shell 十三問(wèn)?

請(qǐng)問(wèn)你是用 bash 嗎?
若你寫(xiě)成 script 的話,確定第一行有定義 interpreter :
#!/bin/bash

論壇徽章:
0
80 [報(bào)告]
發(fā)表于 2004-02-06 12:24 |只看該作者

shell 十三問(wèn)?

原帖由 "網(wǎng)中人" 發(fā)表:
請(qǐng)問(wèn)你是用 bash 嗎?
若你寫(xiě)成 script 的話,確定第一行有定義 interpreter :
#!/bin/bash

謝謝,已經(jīng)解決了,原來(lái)是掉了一個(gè)!號(hào)!〔缓靡馑。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP