# å¤ç Shell è¾å ¥ å°ç®å为æ¢ï¼ä½ å·²ç»çå°äºå¦ä½ç¼åèæ¬ï¼å¤çæ°æ®ãåéå Linux ç³»ç»ä¸çæä»¶ãææ¶ï¼ä½ ç¼åçèæ¬è¿å¾è½å¤ä¸ä½¿ç¨è è¿è¡äº¤äºãbash shell æä¾äºä¸äºä¸åçæ¹æ³æ¥ä»ç¨æ·å¤è·å¾æ°æ®ï¼å æ¬å½ä»¤è¡åæ°ï¼æ·»å å¨å½ä»¤åçæ°æ®ï¼ãå½ä»¤è¡é项ï¼å¯ä¿®æ¹å½ä»¤è¡ä¸ºçåä¸ªåæ¯ï¼ä»¥åç´æ¥ä»é®ç读åè¾å ¥çè½åãæ¬ç« å°ä¼è®¨è®ºå¦ä½å¨ä½ ç bash shell èæ¬è¿ç¨è¿äºæ¹æ³æ¥ä»èæ¬ç¨æ·å¤è·å¾æ°æ®ã ## å½ä»¤è¡åæ° å shell èæ¬ä¼ éæ°æ®çæåºæ¬æ¹æ³æ¯ä½¿ç¨å½ä»¤è¡åæ°ãå½ä»¤è¡åæ°å 许å¨è¿è¡èæ¬æ¶åå½ä»¤è¡æ·»å æ°æ®ã ```bash $ ./addem 10 30 ``` æ¬ä¾åèæ¬ addem ä¼ éäºä¸¤ä¸ªå½ä»¤è¡åæ°ï¼10 å 30ï¼ãèæ¬ä¼éè¿ç¹æ®çå鿥å¤çå½ä»¤è¡åæ°ãåé¢å èå°ä¼ä»ç»å¦ä½å¨ bash shell èæ¬ä¸ä½¿ç¨å½ä»¤è¡åæ°ã ### 读ååæ° bash shell ä¼å°ä¸äºç§°ä¸º`ä½ç½®åæ°`ï¼positional parameterï¼çç¹æ®åéåé ç»è¾å ¥å°å½ä»¤è¡ä¸çææåæ°ãè¿ä¹å æ¬ shell ææ§è¡çèæ¬åç§°ãä½ç½®åæ°å鿝æ åçæ°åï¼$0 æ¯ç¨åºåï¼$1 æ¯ç¬¬ä¸ä¸ªåæ°ï¼$2 æ¯ç¬¬äºä¸ªåæ°ï¼ä¾æ¬¡ç±»æ¨ï¼ç´å°ç¬¬ä¹ä¸ªåæ°$9ã ä¸é¢æ¯å¨ shell èæ¬ä¸ä½¿ç¨å个å½ä»¤è¡åæ°çç®åä¾åã ```bash $ cat test1.sh #!/bin/bash # using one command line parameter # factorial=1 for (( number = 1; number <= $1 ; number++ )) do factorial=$[ $factorial * $number ] done echo The factorial of $1 is $factorial $ $ ./test1.sh 5 The factorial of 5 is 120 $ ``` å¯ä»¥å¨ shell èæ¬ä¸å使ç¨å ¶ä»åé䏿 ·ä½¿ç¨$1 åéãshell èæ¬ä¼èªå¨å°å½ä»¤è¡åæ°çå¼åé ç»åéï¼ä¸éè¦ä½ ä½ä»»ä½å¤çã 妿éè¦è¾å ¥æ´å¤çå½ä»¤è¡åæ°ï¼åæ¯ä¸ªåæ°é½å¿ é¡»ç¨ç©ºæ ¼åå¼ã ```bash $ cat test2.sh #!/bin/bash # testing two command line parameters # total=$[ $1 * $2 ] echo The first parameter is $1. echo The second parameter is $2. echo The total value is $total. $ $ ./test2.sh 2 5 The first parameter is 2. The second parameter is 5. The total value is 10. $ ``` shell ä¼å°æ¯ä¸ªåæ°åé ç»å¯¹åºçåéãå¨åé¢çä¾åä¸ï¼ç¨å°çå½ä»¤è¡åæ°é½æ¯æ°å¼ãä¹å¯ä»¥å¨å½ä»¤è¡ä¸ç¨ææ¬å符串ãshell å°è¾å ¥å°å½ä»¤è¡çå符串å¼ä¼ ç»èæ¬ãä½ç¢°å°å«æç©ºæ ¼çææ¬å符串æ¶å°±ä¼åºç°é®é¢ãè®°ä½ï¼æ¯ä¸ªåæ°é½æ¯ç¨ç©ºæ ¼åéçï¼æä»¥ shell ä¼å°ç©ºæ ¼å½æä¸¤ä¸ªå¼çåé符ãè¦å¨åæ°å¼ä¸å å«ç©ºæ ¼ï¼å¿ é¡»è¦ç¨å¼å·ï¼åå¼å·æåå¼å·åå¯ï¼ã > å°ææ¬å符串ä½ä¸ºåæ°ä¼ éæ¶ï¼å¼å·å¹¶éæ°æ®çä¸é¨åãå®ä»¬åªæ¯è¡¨ææ°æ®çèµ·æ¢ä½ç½®ã å¦æèæ¬éè¦çå½ä»¤è¡åæ°ä¸æ¢ 9 个ï¼ä½ ä»ç¶å¯ä»¥å¤çï¼ä½æ¯éè¦ç¨å¾®ä¿®æ¹ä¸ä¸åéåãå¨ç¬¬ 9 个åéä¹åï¼ä½ å¿ é¡»å¨åéæ°åå¨å´å ä¸è±æ¬å·ï¼æ¯å¦${10}ãè¿ç§æ¹æ³å è®¸ä½ æ ¹æ®éè¦åèæ¬æ·»å ä»»æå¤çå½ä»¤è¡åæ°ãå ä¸è±æ¬å·ä¼æ¾å¾æ¯è¾ç´è§ï¼ä¸è¿ç»è¿æµè¯ï¼ç®åçæ¬ç bash ä¸å è±æ¬å·ä¹å¯ä»¥æ£å¸¸è¿è¡ï¼åªæ¯ä¸æ¯é£ä¹ç´è§ç½¢äºã ### 读åèæ¬å å¯ä»¥ç¨$0 åæ°è·å shell å¨å½ä»¤è¡å¯å¨çèæ¬åãè¿å¨ç¼åå¤åè½å·¥å ·æ¶å¾æ¹ä¾¿ã ```bash $ cat test5.sh #!/bin/bash # Testing the $0 parameter # echo The zero parameter is set to: $0 # $ $ bash test5.sh The zero parameter is set to: test5.sh $ ``` 使¯è¿éåå¨ä¸ä¸ªæ½å¨çé®é¢ãå¦æä½¿ç¨å¦ä¸ç§æ¹å¼æ¥è¿è¡ shell èæ¬ï¼å½ä»¤ä¼åèæ¬åæ··å¨ä¸èµ·ï¼åºç°å¨$0 åæ°ä¸ã ```bash $ ./test5.sh The zero parameter is set to: ./test5.sh $ ``` è¿è¿ä¸æ¯å¯ä¸çé®é¢ãå½ä¼ ç»$0 åéçå®é å符串ä¸ä» ä» æ¯èæ¬åï¼èæ¯å®æ´çèæ¬è·¯å¾æ¶ï¼åé$0 å°±ä¼ä½¿ç¨æ´ä¸ªè·¯å¾ã ```bash $ bash /home/Christine/test5.sh The zero parameter is set to: /home/Christine/test5.sh $ ``` å¦æä½ è¦ç¼åä¸ä¸ªæ ¹æ®èæ¬åæ¥æ§è¡ä¸ååè½çèæ¬ï¼å°±å¾åç¹é¢å¤å·¥ä½ãä½ å¾æèæ¬çè¿è¡è·¯å¾ç»å¥ç¦»æãå¦å¤ï¼è¿è¦å é¤ä¸èæ¬åæ··æå¨ä¸èµ·çå½ä»¤ã 幸好æä¸ªæ¹ä¾¿çå°å½ä»¤å¯ä»¥å¸®å°æä»¬ãbasename å½ä»¤ä¼è¿åä¸å å«è·¯å¾çèæ¬åã ```bash $ cat test5b.sh #!/bin/bash # Using basename with the $0 parameter # name=$(basename $0) echo echo The script name is: $name # $ $ bash /home/Christine/test5b.sh The script name is: test5b.sh $ $ ./test5b.sh The script name is: test5b.sh $ ``` ç°å¨å¥½å¤äºãå¯ä»¥ç¨è¿ç§æ¹æ³æ¥ç¼ååºäºèæ¬åæ§è¡ä¸ååè½çèæ¬ãè¿éæä¸ªç®åçä¾åã ```bash $ cat test6.sh #!/bin/bash # Testing a Multi-function script # name=$(basename $0) # if [ $name = "addem" ] then total=$[ $1 + $2 ] # elif [ $name = "multem" ] then total=$[ $1 * $2 ] fi # echo echo The calculated value is $total # $ $ cp test6.sh addem $ chmod u+x addem $ $ ln -s test6.sh multem $ $ ls -l *em -rwxrw-r--. 1 Christine Christine 224 Jun 30 23:50 addem lrwxrwxrwx. 1 Christine Christine 8 Jun 30 23:50 multem -> test6.sh $ $ ./addem 2 5 The calculated value is 7 $ $ ./multem 2 5 The calculated value is 10 $ ``` æ¬ä¾ä» test6.sh èæ¬ä¸å建äºä¸¤ä¸ªä¸åçæä»¶åï¼ä¸ä¸ªéè¿å¤å¶æä»¶å建ï¼addemï¼ï¼å¦ä¸ä¸ªéè¿é¾æ¥ï¼åè§ç¬¬ 3 ç« ï¼å建ï¼multemï¼ãå¨ä¸¤ç§æ åµä¸é½ä¼å è·å¾èæ¬çåºæ¬åç§°ï¼ç¶åæ ¹æ®è¯¥å¼æ§è¡ç¸åºçåè½ã ### æµè¯åæ° å¨ shell èæ¬ä¸ä½¿ç¨å½ä»¤è¡åæ°æ¶è¦å°å¿äºãå¦æèæ¬ä¸å åæ°è¿è¡ï¼å¯è½ä¼åºé®é¢ã ```bash $ ./addem 2 ./addem: line 8: 2 + : syntax error: operand expected (error token is " ") The calculated value is $ ``` å½èæ¬è®¤ä¸ºåæ°åéä¸ä¼ææ°æ®èå®é ä¸å¹¶æ²¡ææ¶ï¼èæ¬å¾æå¯è½ä¼äº§çéè¯¯æ¶æ¯ãè¿ç§åèæ¬çæ¹æ³å¹¶ä¸å¯åãå¨ä½¿ç¨åæ°åä¸å®è¦æ£æ¥å ¶ä¸æ¯å¦å卿°æ®ã ```bash $ cat test7.sh #!/bin/bash # testing parameters before use # if [ -n "$1" ] then echo Hello $1, glad to meet you. else echo "Sorry, you did not identify yourself. " fi $ $ ./test7.sh Rich Hello Rich, glad to meet you. $ $ ./test7.sh Sorry, you did not identify yourself. $ ``` 卿¬ä¾ä¸ï¼ä½¿ç¨äº-n æµè¯æ¥æ£æ¥å½ä»¤è¡åæ°$1 䏿¯å¦ææ°æ®ãå¨ä¸ä¸èä¸ï¼ä½ ä¼çå°è¿æå¦ä¸ç§æ£æ¥å½ä»¤è¡åæ°çæ¹æ³ã ## ç¹æ®åæ°åé å¨ bash shell 䏿äºç¹æ®åéï¼å®ä»¬ä¼è®°å½å½ä»¤è¡åæ°ãæ¬èå°ä¼ä»ç»è¿äºåéåå ¶ç¨æ³ã ### åæ°ç»è®¡ å¦å¨ä¸ä¸èä¸çå°çï¼å¨èæ¬ä¸ä½¿ç¨å½ä»¤è¡åæ°ä¹ååºè¯¥æ£æ¥ä¸ä¸å½ä»¤è¡åæ°ã对äºä½¿ç¨å¤ä¸ªå½ä»¤è¡åæ°çèæ¬æ¥è¯´ï¼è¿æç¹éº»ç¦ã ä½ å¯ä»¥ç»è®¡ä¸ä¸å½ä»¤è¡ä¸è¾å ¥äºå¤å°ä¸ªåæ°ï¼æ éæµè¯æ¯ä¸ªåæ°ãbash shell ä¸ºæ¤æä¾äºä¸ä¸ªç¹æ®åéã ç¹æ®åé$#å«æèæ¬è¿è¡æ¶æºå¸¦çå½ä»¤è¡åæ°ç个æ°ãå¯ä»¥å¨èæ¬ä¸ä»»ä½å°æ¹ä½¿ç¨è¿ä¸ªç¹æ®åéï¼å°±è·æ®éåé䏿 ·ã ```bash $ cat test8.sh #!/bin/bash # getting the number of parameters # echo There were $# parameters supplied. $ $ ./test8.sh There were 0 parameters supplied. $ $ ./test8.sh 1 2 3 4 5 There were 5 parameters supplied. ``` ç°å¨ä½ å°±è½å¨ä½¿ç¨åæ°åæµè¯åæ°çæ»æ°äºã ```bash $ cat test9.sh #!/bin/bash # Testing parameters # if [ $# -ne 2 ] then echo echo Usage: test9.sh a b echo else total=$[ $1 + $2 ] echo echo The total is $total echo fi # $ $ bash test9.sh Usage: test9.sh a b $ bash test9.sh 10 15 The total is 25 $ ``` if-then è¯å¥ç¨-ne æµè¯å½ä»¤è¡åæ°æ°éã妿忰æ°éä¸å¯¹ï¼ä¼æ¾ç¤ºä¸æ¡éè¯¯æ¶æ¯åç¥èæ¬çæ£ç¡®ç¨æ³ã è¿ä¸ªåéè¿æä¾äºä¸ä¸ªç®ä¾¿æ¹æ³æ¥è·åå½ä»¤è¡ä¸æåä¸ä¸ªåæ°ï¼å®å ¨ä¸éè¦ç¥éå®é ä¸å°åºç¨äºå¤å°ä¸ªåæ°ãä¸è¿è¦å®ç°è¿ä¸ç¹ï¼å¾ç¨å¾®å¤è±ç¹å·¥å¤«ãå¦æä½ ä»ç»èèè¿ï¼å¯è½ä¼è§å¾æ¢ç¶$#åéå«æåæ°çæ»æ°ï¼é£ä¹åé${$#}å°±ä»£è¡¨äºæåä¸ä¸ªå½ä»¤è¡åæ°åéãè¯è¯çä¼åçä»ä¹ã ```bash $ cat badtest1.sh #!/bin/bash # testing grabbing last parameter # echo The last parameter was ${$#} $ $ ./badtest1.sh 10 The last parameter was 15354 $ ``` æä¹äºï¼æ¾ç¶ï¼åºäºç¹é®é¢ãå®è¡¨æä½ ä¸è½å¨è±æ¬å·å 使ç¨ç¾å 符ãå¿ é¡»å°ç¾å ç¬¦æ¢ææå¹å·ãå¾å¥æªï¼ä½ç确管ç¨ã ```bash $ cat test10.sh #!/bin/bash # Grabbing the last parameter # params=$# echo echo The last parameter is $params echo The last parameter is ${!#} echo # $ $ bash test10.sh 1 2 3 4 5 The last parameter is 5 The last parameter is 5 $ $ bash test10.sh The last parameter is 0 The last parameter is test10.sh $ ``` è¿ä¸ªæµè¯å°$#åéçå¼èµç»äºåéparamsï¼ç¶åä¹æç¹æ®å½ä»¤è¡åæ°åéçæ ¼å¼ä½¿ç¨äºè¯¥åéãä¸¤ç§æ¹æ³é½æ²¡é®é¢ãéè¦çæ¯è¦æ³¨æï¼å½å½ä»¤è¡ä¸æ²¡æä»»ä½åæ°æ¶ï¼$#çå¼ä¸º 0ï¼params åéçå¼ä¹ä¸æ ·ï¼ä½${!#}åéä¼è¿åå½ä»¤è¡ç¨å°çèæ¬åã ### æåææçæ°æ® ææ¶åéè¦æåå½ä»¤è¡ä¸æä¾çææåæ°ãè¿æ¶åä¸éè¦å ç¨$#å鿥夿å½ä»¤è¡ä¸æå¤å°åæ°ï¼ç¶ååè¿è¡éåï¼ä½ å¯ä»¥ä½¿ç¨ä¸ç»å ¶ä»çç¹æ®åéæ¥è§£å³è¿ä¸ªé®é¢ã $\*å$@åéå¯ä»¥ç¨æ¥è½»æ¾è®¿é®ææçåæ°ãè¿ä¸¤ä¸ªåéé½è½å¤å¨å个åéä¸å卿æçå½ä»¤è¡åæ°ã $\*åéä¼å°å½ä»¤è¡ä¸æä¾çææåæ°å½ä½ä¸ä¸ªåè¯ä¿åãè¿ä¸ªåè¯å å«äºå½ä»¤è¡ä¸åºç°çæ¯ä¸ä¸ªåæ°å¼ãåºæ¬ä¸$\*åéä¼å°è¿äºåæ°è§ä¸ºä¸ä¸ªæ´ä½ï¼è䏿¯å¤ä¸ªä¸ªä½ã å¦ä¸æ¹é¢ï¼$@åéä¼å°å½ä»¤è¡ä¸æä¾çææåæ°å½ä½åä¸å符串ä¸çå¤ä¸ªç¬ç«çåè¯ãè¿æ ·ä½ å°±è½å¤éåææçåæ°å¼ï¼å¾å°æ¯ä¸ªåæ°ãè¿é常éè¿ for å½ä»¤å®æã è¿ä¸¤ä¸ªåéç工使¹å¼ä¸å¤ªå®¹æçè§£ãç个ä¾åï¼ä½ å°±è½çè§£äºè ä¹é´çåºå«äºã ```bash $ cat test11.sh #!/bin/bash # testing $* and $@ # echo echo "Using the \$* method: $*" echo echo "Using the \$@ method: $@" $ $ ./test11.sh rich barbara katie jessica Using the $* method: rich barbara katie jessica Using the $@ method: rich barbara katie jessica $ ``` 注æï¼ä»è¡¨é¢ä¸çï¼ä¸¤ä¸ªåé产ççæ¯åæ ·çè¾åºï¼é½æ¾ç¤ºåºäºææå½ä»¤è¡åæ°ãä¸é¢çä¾åç»åºäºäºè çå·®å¼ã ```bash $ cat test12.sh #!/bin/bash # testing $* and $@ # echo count=1 # for param in "$*" do echo "\$* Parameter #$count = $param" count=$[ $count + 1 ] done # echo count=1 # for param in "$@" do echo "\$@ Parameter #$count = $param" count=$[ $count + 1 ] done $ $ ./test12.sh rich barbara katie jessica $* Parameter #1 = rich barbara katie jessica $@ Parameter #1 = rich $@ Parameter #2 = barbara $@ Parameter #3 = katie $@ Parameter #4 = jessica $ ``` ç°å¨æ¸ æ¥å¤äºãéè¿ä½¿ç¨ for å½ä»¤éåè¿ä¸¤ä¸ªç¹æ®åéï¼ä½ è½çå°å®ä»¬æ¯å¦ä½ä¸åå°å¤çå½ä»¤è¡åæ°çã$*åéä¼å°ææåæ°å½æåä¸ªåæ°ï¼è$@åéä¼åç¬å¤çæ¯ä¸ªåæ°ãè¿æ¯éåå½ä»¤è¡åæ°çä¸ä¸ªç»å¦æ¹æ³ã ## ç§»å¨åé bash shell å·¥å ·ç®±ä¸å¦ä¸ä»¶å·¥å ·æ¯ shift å½ä»¤ãbash shell ç shift å½ä»¤è½å¤ç¨æ¥æä½å½ä»¤è¡åæ°ãè·åé¢ä¸çææä¸æ ·ï¼shift å½ä»¤ä¼æ ¹æ®å®ä»¬çç¸å¯¹ä½ç½®æ¥ç§»å¨å½ä»¤è¡åæ°ã å¨ä½¿ç¨ shift å½ä»¤æ¶ï¼é»è®¤æ åµä¸å®ä¼å°æ¯ä¸ªåæ°åéå左移å¨ä¸ä¸ªä½ç½®ãæä»¥ï¼åé$3 çå¼ä¼ç§»å°$2 ä¸ï¼åé$2 çå¼ä¼ç§»å°$1 ä¸ï¼èåé$1 çå¼åä¼è¢«å é¤ï¼æ³¨æï¼åé$0 çå¼ï¼ä¹å°±æ¯ç¨åºåï¼ä¸ä¼æ¹åï¼ã è¿æ¯éåå½ä»¤è¡åæ°çå¦ä¸ä¸ªå¥½æ¹æ³ï¼å°¤å ¶æ¯å¨ä½ ä¸ç¥éå°åºæå¤å°åæ°æ¶ãä½ å¯ä»¥åªæä½ç¬¬ä¸ä¸ªåæ°ï¼ç§»å¨åæ°ï¼ç¶åç»§ç»æä½ç¬¬ä¸ä¸ªåæ°ãè¿éæä¸ªä¾åæ¥è§£é宿¯å¦ä½å·¥ä½çã ```bash $ cat test13.sh #!/bin/bash # demonstrating the shift command echo count=1 while [ -n "$1" ] do echo "Parameter #$count = $1" count=$[ $count + 1 ] shift done $ $ ./test13.sh rich barbara katie jessica Parameter #1 = rich Parameter #2 = barbara Parameter #3 = katie Parameter #4 = jessica $ ``` è¿ä¸ªèæ¬éè¿æµè¯ç¬¬ä¸ä¸ªåæ°å¼çé¿åº¦æ§è¡äºä¸ä¸ª while 循ç¯ãå½ç¬¬ä¸ä¸ªåæ°çé¿åº¦ä¸ºé¶æ¶ï¼å¾ªç¯ç»æãæµè¯å®ç¬¬ä¸ä¸ªåæ°åï¼shift å½ä»¤ä¼å°ææåæ°çä½ç½®ç§»å¨ä¸ä¸ªä½ç½®ã > ä½¿ç¨ shift å½ä»¤çæ¶åè¦å°å¿ã妿æä¸ªåæ°è¢«ç§»åºï¼å®çå¼å°±è¢«ä¸¢å¼äºï¼æ æ³åæ¢å¤ã å¦å¤ï¼ä½ ä¹å¯ä»¥ä¸æ¬¡æ§ç§»å¨å¤ä¸ªä½ç½®ï¼åªéè¦ç» shift å½ä»¤æä¾ä¸ä¸ªåæ°ï¼ææè¦ç§»å¨çä½ç½®æ°å°±è¡äºãå¦`shift 2`䏿¬¡æ§ç§»å¨ä¸¤ä¸ªä½ç½®ã ## å¤çé项 å¦æä½ è®¤çè¯»è¿æ¬ä¹¦åé¢çææå 容ï¼åºè¯¥å°±è§è¿äºä¸äºåæ¶æä¾äºåæ°åé项ç bash å½ä»¤ãé项æ¯è·å¨åç ´æçº¿åé¢çåä¸ªåæ¯ï¼å®è½æ¹åå½ä»¤çè¡ä¸ºãæ¬èå°ä¼ä»ç» 3 ç§å¨èæ¬ä¸å¤çéé¡¹çæ¹æ³ã ### æ¥æ¾é项 表é¢ä¸çï¼å½ä»¤è¡é项乿²¡ä»ä¹ç¹æ®çãå¨å½ä»¤è¡ä¸ï¼å®ä»¬ç´§è·å¨èæ¬åä¹åï¼å°±è·å½ä»¤è¡åæ°ä¸æ ·ãå®é ä¸ï¼å¦ææ¿æï¼ä½ å¯ä»¥åå¤çå½ä»¤è¡åæ°ä¸æ ·å¤çå½ä»¤è¡é项ã 1. å¤çç®åé项 å¨åé¢ç test13.sh èæ¬ä¸ï¼ä½ çå°äºå¦ä½ä½¿ç¨ shift å½ä»¤æ¥ä¾æ¬¡å¤çèæ¬ç¨åºæºå¸¦çå½ä»¤è¡åæ°ãä½ ä¹å¯ä»¥ç¨åæ ·çæ¹æ³æ¥å¤çå½ä»¤è¡é项ãå¨æåæ¯ä¸ªåç¬åæ°æ¶ï¼ç¨ case è¯å¥æ¥å¤ææä¸ªåæ°æ¯å¦ä¸ºé项ã ```bash $ cat test15.sh #!/bin/bash # extracting command line options as parameters # echo while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option" ;; -b) echo "Found the -b option" ;; -c) echo "Found the -c option" ;; *) echo "$1 is not an option" ;; esac shift done $ $ ./test15.sh -a -b -c -d Found the -a option Found the -b option Found the -c option -d is not an option $ ``` case è¯å¥ä¼æ£æ¥æ¯ä¸ªåæ°æ¯ä¸æ¯ææé项ã妿æ¯çè¯ï¼å°±è¿è¡å¯¹åº case è¯å¥ä¸çå½ä»¤ãä¸ç®¡é项æä»ä¹é¡ºåºåºç°å¨å½ä»¤è¡ä¸ï¼è¿ç§æ¹æ³é½éç¨ãcase è¯å¥å¨å½ä»¤è¡åæ°ä¸æ¾å°ä¸ä¸ªé项ï¼å°±å¤çä¸ä¸ªé项ã妿å½ä»¤è¡ä¸è¿æä¾äºå ¶ä»åæ°ï¼ä½ å¯ä»¥å¨ case è¯å¥çéç¨æ åµå¤çé¨åä¸å¤çã 2. åç¦»åæ°åé项 ä½ ä¼ç»å¸¸éå°å¨ shell èæ¬ä¸åæ¶ä½¿ç¨é项ååæ°çæ åµãLinux ä¸å¤çè¿ä¸ªé®é¢çæ 忹弿¯ç¨ç¹æ®å符æ¥å°äºè åå¼ï¼è¯¥å符ä¼åè¯èæ¬ä½æ¶éé¡¹ç»æä»¥åæ®é忰使¶å¼å§ã 对 Linux æ¥è¯´ï¼è¿ä¸ªç¹æ®å符æ¯åç ´æçº¿ï¼--ï¼ãshell ä¼ç¨åç ´æçº¿æ¥è¡¨æé项åè¡¨ç»æãå¨åç ´æçº¿ä¹åï¼èæ¬å°±å¯ä»¥æ¾å¿å°å°å©ä¸çå½ä»¤è¡åæ°å½ä½åæ°ï¼è䏿¯é项æ¥å¤çäºã è¦æ£æ¥åç ´æçº¿ï¼åªè¦å¨ case è¯å¥ä¸å ä¸é¡¹å°±è¡äºã ```bash $ cat test16.sh #!/bin/bash # extracting options and parameters # echo while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option" ;; -b) echo "Found the -b option" ;; -c) echo "Found the -c option" ;; --) shift break ;; *) echo "$1 is not an option" ;; esac shift done count=1 for param in $@ do echo "Parameter #$count: $param" count=$[ $count + 1 ] done ``` å¨éå°åç ´æçº¿æ¶ï¼èæ¬ç¨ break å½ä»¤æ¥è·³åº while 循ç¯ãç±äºè¿æ©å°è·³åºäºå¾ªç¯ï¼æä»¬éè¦åå 䏿¡ shift å½ä»¤æ¥å°åç ´æçº¿ç§»åºåæ°åéã 对äºç¬¬ä¸ä¸ªæµè¯ï¼è¯è¯ç¨ä¸ç»æ®éçé项ååæ°æ¥è¿è¡è¿ä¸ªèæ¬ã ```bash $ $ ./test16.sh -c -a -b test1 test2 test3 Found the -c option Found the -a option Found the -b option test1 is not an option test2 is not an option test3 is not an option $ ``` ç»æè¯´æå¨å¤çæ¶èæ¬è®¤ä¸ºææçå½ä»¤è¡åæ°é½æ¯éé¡¹ãæ¥ä¸æ¥ï¼è¿è¡åæ ·çæµè¯ï¼åªæ¯è¿æ¬¡ä¼ç¨åç ´æçº¿æ¥å°å½ä»¤è¡ä¸çé项ååæ°åå弿¥ã ```bash $ ./test16.sh -c -a -b -- test1 test2 test3 Found the -c option Found the -a option Found the -b option Parameter #1: test1 Parameter #2: test2 Parameter #3: test3 $ ``` å½èæ¬éå°åç ´æçº¿æ¶ï¼å®ä¼åæ¢å¤çé项ï¼å¹¶å°å©ä¸çåæ°é½å½ä½å½ä»¤è¡åæ°ã 3. å¤ç带å¼çé项 æäºé项ä¼å¸¦ä¸ä¸ä¸ªé¢å¤çåæ°å¼ãå¨è¿ç§æ åµä¸ï¼å½ä»¤è¡çèµ·æ¥åä¸é¢è¿æ ·ã ```bash $ ./testing.sh -a test1 -b -c -d test2 ``` å½å½ä»¤è¡éé¡¹è¦æ±é¢å¤çåæ°æ¶ï¼èæ¬å¿ é¡»è½æ£æµå°å¹¶æ£ç¡®å¤çãä¸é¢æ¯å¦ä½å¤ççä¾åã ```bash $ cat test17.sh #!/bin/bash # extracting command line options and values echo while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option";; -b) param="$2" echo "Found the -b option, with parameter value $param" shift ;; -c) echo "Found the -c option";; --) shift break ;; *) echo "$1 is not an option";; esac shift done # count=1 for param in "$@" do echo "Parameter #$count: $param" count=$[ $count + 1 ] done $ $ ./test17.sh -a -b test1 -d Found the -a option Found the -b option, with parameter value test1 -d is not an option $ ``` å¨è¿ä¸ªä¾åä¸ï¼case è¯å¥å®ä¹äºä¸ä¸ªå®è¦å¤ççé项ã-b é项è¿éè¦ä¸ä¸ªé¢å¤çåæ°å¼ãç±äºè¦å¤ççåæ°æ¯$1ï¼é¢å¤çåæ°å¼å°±åºè¯¥ä½äº$2ï¼å 为ææçåæ°å¨å¤çå®ä¹åé½ä¼è¢«ç§»åºï¼ãåªè¦å°åæ°å¼ä»$2 åé䏿ååºæ¥å°±å¯ä»¥äºãå½ç¶ï¼å 为è¿ä¸ªé项å ç¨äºä¸¤ä¸ªåæ°ä½ï¼æä»¥ä½ è¿éè¦ä½¿ç¨ shift å½ä»¤å¤ç§»å¨ä¸ä¸ªä½ç½®ã åªç¨è¿äºåºæ¬çç¹æ§ï¼æ´ä¸ªè¿ç¨å°±è½æ£å¸¸å·¥ä½ï¼ä¸ç®¡æä»ä¹é¡ºåºæ¾ç½®é项ï¼ä½è¦è®°ä½å 嫿¯ä¸ªé项ç¸åºçé项忰ï¼ãç°å¨ shell èæ¬ä¸å·²ç»æäºå¤çå½ä»¤è¡é项çåºæ¬è½åï¼ä½è¿æä¸äºéå¶ãæ¯å¦ï¼å¦æä½ æ³å°å¤ä¸ªé项æ¾è¿ä¸ä¸ªåæ°ä¸æ¶ï¼å®å°±ä¸è½å·¥ä½äºã ```bash $ ./test17.sh -ac -ac is not an option $ ``` å¨ Linux ä¸ï¼åå¹¶é项æ¯ä¸ä¸ªå¾å¸¸è§çç¨æ³ï¼èä¸å¦æèæ¬æ³è¦å¯¹ç¨æ·æ´å好ä¸äºï¼ä¹è¦ç»ç¨æ·æä¾è¿ç§ç¹æ§ãå¹¸å¥½ï¼æå¦å¤ä¸ç§å¤çéé¡¹çæ¹æ³è½å¤å¸®å¿ã ### ä½¿ç¨ getopt å½ä»¤ getopt å½ä»¤æ¯ä¸ä¸ªå¨å¤çå½ä»¤è¡é项ååæ°æ¶é常æ¹ä¾¿çå·¥å ·ãå®è½å¤è¯å«å½ä»¤è¡åæ°ï¼ä»èå¨èæ¬ä¸è§£æå®ä»¬æ¶æ´æ¹ä¾¿ã 1. å½ä»¤çæ ¼å¼ getopt å½ä»¤å¯ä»¥æ¥åä¸ç³»åä»»æå½¢å¼çå½ä»¤è¡é项ååæ°ï¼å¹¶èªå¨å°å®ä»¬è½¬æ¢æéå½çæ ¼å¼ãå®çå½ä»¤æ ¼å¼å¦ä¸ï¼ ```bash getopt optstring parameters ``` optstring æ¯è¿ä¸ªè¿ç¨çå ³é®æå¨ãå®å®ä¹äºå½ä»¤è¡ææçé项忝ï¼è¿å®ä¹äºåªäºé项忝éè¦åæ°å¼ã é¦å ï¼å¨ optstring ä¸ååºä½ è¦å¨èæ¬ä¸ç¨å°çæ¯ä¸ªå½ä»¤è¡é项忝ãç¶åï¼å¨æ¯ä¸ªéè¦åæ°å¼çé项忝åå ä¸ä¸ªåå·ãgetopt å½ä»¤ä¼åºäºä½ å®ä¹ç optstring è§£ææä¾çåæ°ã > getopt å½ä»¤æä¸ä¸ªæ´é«çº§ççæ¬å«ä½ getoptsï¼æ³¨æè¿æ¯å¤æ°å½¢å¼ï¼ãgetopts å½ä»¤ä¼å¨æ¬ç« éåé¨å讲å°ãå 为è¿ä¸¤ä¸ªå½ä»¤çæ¼åå ä¹ä¸æ¨¡ä¸æ ·ï¼æä»¥å¾å®¹æææ··ãä¸å®è¦å°å¿ ä¸é¢æ¯ä¸ª getopt å¦ä½å·¥ä½çç®åä¾åã ```bash $ getopt ab:cd -a -b test1 -cd test2 test3 -a -b test1 -c -d -- test2 test3 $ ``` optstring å®ä¹äºå个ææé项忝ï¼aãbãc å dãåå·ï¼:ï¼è¢«æ¾å¨äºåæ¯ b åé¢ï¼å 为 b é项éè¦ä¸ä¸ªåæ°å¼ãå½ getopt å½ä»¤è¿è¡æ¶ï¼å®ä¼æ£æ¥æä¾çåæ°å表ï¼-a -b test1 -cd test2 test3ï¼ï¼å¹¶åºäºæä¾ç optstring è¿è¡è§£æã注æï¼å®ä¼èªå¨å°-cd é项åæä¸¤ä¸ªåç¬çé项ï¼å¹¶æå ¥åç ´æçº¿æ¥åéè¡ä¸çé¢å¤åæ°ã 妿æå®äºä¸ä¸ªä¸å¨ optstring ä¸çé项ï¼é»è®¤æ åµä¸ï¼getopt å½ä»¤ä¼äº§ç䏿¡éè¯¯æ¶æ¯ã ```bash $ getopt ab:cd -a -b test1 -cde test2 test3 getopt: invalid option -- e -a -b test1 -c -d -- test2 test3 $ ``` 妿æ³å¿½ç¥è¿æ¡éè¯¯æ¶æ¯ï¼å¯ä»¥å¨å½ä»¤åå -q é项ã ```bash $ getopt -q ab:cd -a -b test1 -cde test2 test3 -a -b test1 -c -d -- test2 test3 $ ``` 注æï¼getopt å½ä»¤éé¡¹å¿ é¡»åºç°å¨ optstring ä¹åãç°å¨åºè¯¥å¯ä»¥å¨èæ¬ä¸ä½¿ç¨æ¤å½ä»¤å¤çå½ä»¤è¡éé¡¹äº 2. å¨èæ¬ä¸ä½¿ç¨ getopt å¯ä»¥å¨èæ¬ä¸ä½¿ç¨ getopt æ¥æ ¼å¼åèæ¬ææºå¸¦çä»»ä½å½ä»¤è¡é项æåæ°ï¼ä½ç¨èµ·æ¥ç¥å¾®å¤æãæ¹æ³æ¯ç¨ getopt å½ä»¤çæçæ ¼å¼ååççæ¬æ¥æ¿æ¢å·²æçå½ä»¤è¡é项ååæ°ãç¨ set å½ä»¤è½å¤åå°ãå¨ç¯å¢åéçç« èä¸ï¼ä½ 就已ç»è§è¿ set å½ä»¤äºãset å½ä»¤è½å¤å¤ç shell ä¸çåç§åéã set å½ä»¤çé项ä¹ä¸æ¯åç ´æçº¿ï¼--ï¼ï¼å®ä¼å°å½ä»¤è¡åæ°æ¿æ¢æ set å½ä»¤çå½ä»¤è¡å¼ãç¶åï¼è¯¥æ¹æ³ä¼å°åå§èæ¬çå½ä»¤è¡åæ°ä¼ ç» getopt å½ä»¤ï¼ä¹ååå° getopt å½ä»¤çè¾åºä¼ ç» set å½ä»¤ï¼ç¨ getopt æ ¼å¼ååçå½ä»¤è¡åæ°æ¥æ¿æ¢åå§çå½ä»¤è¡åæ°ï¼çèµ·æ¥å¦ä¸æç¤ºã ```bash set -- $(getopt -q ab:cd "$@") ``` ç°å¨åå§çå½ä»¤è¡åæ°åéçå¼ä¼è¢« getopt å½ä»¤çè¾åºæ¿æ¢ï¼è getopt å·²ç»ä¸ºæä»¬æ ¼å¼å好äºå½ä»¤è¡åæ°ãå©ç¨è¯¥æ¹æ³ï¼ç°å¨å°±å¯ä»¥ååºè½å¸®æä»¬å¤çå½ä»¤è¡åæ°çèæ¬ã ```bash $ cat test18.sh #!/bin/bash # Extract command line options & values with getopt # set -- $(getopt -q ab:cd "$@") # echo while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option" ;; -b) param="$2" echo "Found the -b option, with parameter value $param" shift ;; -c) echo "Found the -c option" ;; --) shift break ;; *) echo "$1 is not an option";; esac shift done # count=1 for param in "$@" do echo "Parameter #$count: $param" count=$[ $count + 1 ] done # $ ``` ä½ ä¼æ³¨æå°å®è·èæ¬ test17.sh 䏿 ·ï¼å¯ä¸ä¸åçæ¯å å ¥äº getopt å½ä»¤æ¥å¸®å©æ ¼å¼åå½ä»¤è¡åæ°ãç°å¨å¦æè¿è¡å¸¦æå¤æé项çèæ¬ï¼å°±å¯ä»¥çåºæææ´å¥½äºã ```bash $ ./test18.sh -ac Found the -a option Found the -c option $ ``` å½ç¶ï¼ä¹åçåè½ç §æ ·æ²¡æé®é¢ã ```bash $ ./test18.sh -a -b test1 -cd test2 test3 test4 Found the -a option Found the -b option, with parameter value 'test1' Found the -c option -d is not an option Parameter #1: 'test2' Parameter #2: 'test3' Parameter #3: 'test4' $ ``` ç°å¨çèµ·æ¥ç¸å½ä¸éäºã使¯ï¼å¨ getopt å½ä»¤ä¸ä»ç¶éèçä¸ä¸ªå°é®é¢ãççè¿ä¸ªä¾åã ```bash $ ./test18.sh -a -b test1 -cd "test2 test3" test4 Found the -a option Found the -b option, with parameter value 'test1' Found the -c option -d is not an option Parameter #1: 'test2 Parameter #2: test3' Parameter #3: 'test4' $ ``` getopt å½ä»¤å¹¶ä¸æ é¿å¤çå¸¦ç©ºæ ¼åå¼å·çåæ°å¼ãå®ä¼å°ç©ºæ ¼å½ä½åæ°åé符ï¼è䏿¯æ ¹æ®åå¼å·å°äºè å½ä½ä¸ä¸ªåæ°ã幸èè¿æå¦å¤ä¸ä¸ªåæ³è½è§£å³è¿ä¸ªé®é¢ã ### ä½¿ç¨æ´é«çº§ç getopts getopts å½ä»¤ï¼æ³¨ææ¯å¤æ°ï¼å å»ºäº bash shellãå®è·è¿äº² getopt çèµ·æ¥å¾åï¼ä½å¤äºä¸äºæ©å±åè½ã ä¸ getopt ä¸åï¼åè å°å½ä»¤è¡ä¸é项ååæ°å¤çååªçæä¸ä¸ªè¾åºï¼è getopts å½ä»¤è½å¤åå·²æç shell åæ°åéé åé»å¥ã æ¯æ¬¡è°ç¨å®æ¶ï¼å®ä¸æ¬¡åªå¤çå½ä»¤è¡ä¸æ£æµå°çä¸ä¸ªåæ°ãå¤ç宿æçåæ°åï¼å®ä¼éåºå¹¶è¿åä¸ä¸ªå¤§äº 0 çéåºç¶æç ãè¿è®©å®é常éåç¨äºè§£æå½ä»¤è¡ææåæ°ç循ç¯ä¸ã getopts å½ä»¤çæ ¼å¼å¦ä¸ï¼ ```bash getopts optstring variable ``` optstring å¼ç±»ä¼¼äº getopt å½ä»¤ä¸çé£ä¸ªãææçé项忝é½ä¼åå¨ optstring ä¸ï¼å¦æéé¡¹åæ¯è¦æ±æä¸ªåæ°å¼ï¼å°±å ä¸ä¸ªåå·ãè¦å»æéè¯¯æ¶æ¯çè¯ï¼å¯ä»¥å¨ optstring ä¹åå ä¸ä¸ªåå·ãgetopts å½ä»¤å°å½ååæ°ä¿åå¨å½ä»¤è¡ä¸å®ä¹ç variable ä¸ã getopts å½ä»¤ä¼ç¨å°ä¸¤ä¸ªç¯å¢åéã妿é项éè¦è·ä¸ä¸ªåæ°å¼ï¼OPTARG ç¯å¢åéå°±ä¼ä¿åè¿ä¸ªå¼ãOPTIND ç¯å¢åéä¿åäºåæ°åè¡¨ä¸ getopts æ£å¨å¤ççåæ°ä½ç½®ãè¿æ ·ä½ å°±è½å¨å¤çå®é项ä¹åç»§ç»å¤çå ¶ä»å½ä»¤è¡åæ°äºã让æä»¬çä¸ªä½¿ç¨ getopts å½ä»¤çç®åä¾åã ```bash $ cat test19.sh #!/bin/bash # simple demonstration of the getopts command # echo while getopts :ab:c opt do case "$opt" in a) echo "Found the -a option" ;; b) echo "Found the -b option, with value $OPTARG";; c) echo "Found the -c option" ;; *) echo "Unknown option: $opt";; esac done $ $ ./test19.sh -ab test1 -c Found the -a option Found the -b option, with value test1 Found the -c option $ ``` while è¯å¥å®ä¹äº getopts å½ä»¤ï¼ææäºè¦æ¥æ¾åªäºå½ä»¤è¡é项ï¼ä»¥åæ¯æ¬¡è¿ä»£ä¸åå¨å®ä»¬çåéåï¼optï¼ã ä½ ä¼æ³¨æå°å¨æ¬ä¾ä¸ case è¯å¥çç¨æ³æäºä¸åãgetopts å½ä»¤è§£æå½ä»¤è¡é项æ¶ä¼ç§»é¤å¼å¤´çåç ´æçº¿ï¼æä»¥å¨ case å®ä¹ä¸ä¸ç¨åç ´æçº¿ã getopts å½ä»¤æå 个好ç¨çåè½ãå¯¹æ°ææ¥è¯´ï¼å¯ä»¥å¨åæ°å¼ä¸å å«ç©ºæ ¼ã ```bash $ ./test19.sh -b "test1 test2" -a Found the -b option, with value test1 test2 Found the -a option $ ``` å¦ä¸ä¸ªå¥½ç¨çåè½æ¯å°é项忝å忰弿¾å¨ä¸èµ·ä½¿ç¨ï¼èä¸ç¨å ç©ºæ ¼ã ```bash $ ./test19.sh -abtest1 Found the -a option Found the -b option, with value test1 $ ``` getopts å½ä»¤è½å¤ä»-b é项䏿£ç¡®è§£æåº test1 å¼ã餿¤ä¹å¤ï¼getopts è¿è½å¤å°å½ä»¤è¡ä¸æ¾å°çæææªå®ä¹çé项ç»ä¸è¾åºæé®å·ã ```bash $ ./test19.sh -d Unknown option: ? $ $ ./test19.sh -acde Found the -a option Found the -c option Unknown option: ? Unknown option: ? $ ``` optstring 䏿ªå®ä¹çé项忝ä¼ä»¥é®å·å½¢å¼åéç»ä»£ç ã getopts å½ä»¤ç¥é使¶åæ¢å¤çé项ï¼å¹¶å°åæ°çç»ä½ å¤çãå¨ getopts å¤çæ¯ä¸ªé项æ¶ï¼å®ä¼å° OPTIND ç¯å¢åéå¼å¢ä¸ãå¨ getopts 宿å¤çæ¶ï¼ä½ å¯ä»¥ä½¿ç¨ shift å½ä»¤å OPTIND 弿¥ç§»å¨åæ°ã ```bash $ cat test20.sh #!/bin/bash # Processing options & parameters with getopts # echo while getopts :ab:cd opt do case "$opt" in a) echo "Found the -a option" ;; b) echo "Found the -b option, with value $OPTARG" ;; c) echo "Found the -c option" ;; d) echo "Found the -d option" ;; *) echo "Unknown option: $opt" ;; esac done # shift $[ $OPTIND - 1 ] # echo count=1 for param in "$@" do echo "Parameter $count: $param" count=$[ $count + 1 ] done # $ $ ./test20.sh -a -b test1 -d test2 test3 test4 Found the -a option Found the -b option, with value test1 Found the -d option Parameter 1: test2 Parameter 2: test3 Parameter 3: test4 $ ``` ç°å¨ä½ å°±æ¥æäºä¸ä¸ªè½å¨ææ shell èæ¬ä¸ä½¿ç¨çå ¨åè½å½ä»¤è¡é项ååæ°å¤çå·¥å ·ã ## å°é项æ åå å¨å建 shell èæ¬æ¶ï¼æ¾ç¶å¯ä»¥æ§å¶å ·ä½æä¹åãä½ å®å ¨å¯ä»¥å³å®ç¨åªäºåæ¯é项以åå®ä»¬çç¨æ³ã使äºåæ¯éé¡¹å¨ Linux ä¸çéå·²ç»æ¥æäºæç§ç¨åº¦çæ åå«ä¹ãå¦æä½ è½å¨ shell èæ¬ä¸æ¯æè¿äºé项ï¼èæ¬çèµ·æ¥è½æ´å好ä¸äºãä¸é¢å±ç¤ºäº Linux ä¸ç¨å°çä¸äºå½ä»¤è¡é项ç常ç¨å«ä¹ã - -a æ¾ç¤ºææå¯¹è±¡ - -c çæä¸ä¸ªè®¡æ° - -d æå®ä¸ä¸ªç®å½ - -e æ©å±ä¸ä¸ªå¯¹è±¡ - -f æå®è¯»å ¥æ°æ®çæä»¶ - -h æ¾ç¤ºå½ä»¤ç帮å©ä¿¡æ¯ - -i å¿½ç¥ææ¬å¤§å°å - -l 产çè¾åºçé¿æ ¼å¼çæ¬ - -n 使ç¨éäº¤äºæ¨¡å¼ï¼æ¹å¤çï¼ - -o å°ææè¾åºéå®åå°çæå®çè¾åºæä»¶ - -q 以å®é模å¼è¿è¡ - -r éå½å°å¤çç®å½åæä»¶ - -s 以å®é模å¼è¿è¡ - -v çæè¯¦ç»è¾åº - -x æé¤æä¸ªå¯¹è±¡ - -y 对ææé®é¢åç yes éè¿å¦ä¹ æ¬ä¹¦æ¶éå°çåç§ bash å½ä»¤ï¼ä½ 大æ¦å·²ç»ç¥éè¿äºé项ä¸å¤§é¨åçå«ä¹äºãå¦æä½ çé项ä¹éç¨åæ ·çå«ä¹ï¼è¿æ ·ç¨æ·å¨ä½¿ç¨ä½ çèæ¬æ¶å°±ä¸ç¨å»æ¥æåäºã ## è·å¾ç¨æ·è¾å ¥ 尽管å½ä»¤è¡é项ååæ°æ¯ä»èæ¬ç¨æ·å¤è·å¾è¾å ¥çä¸ç§éè¦æ¹å¼ï¼ä½ææ¶èæ¬çäº¤äºæ§è¿éè¦æ´å¼ºä¸äºãæ¯å¦ä½ æ³è¦å¨èæ¬è¿è¡æ¶é®ä¸ªé®é¢ï¼å¹¶çå¾ è¿è¡èæ¬ç人æ¥åçãbash shell ä¸ºæ¤æä¾äº read å½ä»¤ã ### åºæ¬ç读å read å½ä»¤ä»æ åè¾å ¥ï¼é®çï¼æå¦ä¸ä¸ªæä»¶æè¿°ç¬¦ä¸æ¥åè¾å ¥ã卿¶å°è¾å ¥åï¼read å½ä»¤ä¼å°æ°æ®æ¾è¿ä¸ä¸ªåéãä¸é¢æ¯ read å½ä»¤çæç®åç¨æ³ã ```bash $ cat test21.sh #!/bin/bash # testing the read command # echo -n "Enter your name: " read name echo "Hello $name, welcome to my program. " # $ $ ./test21.sh Enter your name: Rich Blum Hello Rich Blum, welcome to my program. $ ``` ç¸å½ç®åãæ³¨æï¼çææç¤ºç echo å½ä»¤ä½¿ç¨äº-n é项ã该é项ä¸ä¼å¨å符串æ«å°¾è¾åºæ¢è¡ç¬¦ï¼å è®¸èæ¬ç¨æ·ç´§è·å ¶åè¾å ¥æ°æ®ï¼è䏿¯ä¸ä¸è¡ãè¿è®©èæ¬çèµ·æ¥æ´å表åã å®é ä¸ï¼read å½ä»¤å å«äº-p é项ï¼å è®¸ä½ ç´æ¥å¨ read å½ä»¤è¡æå®æç¤ºç¬¦ã ```bash $ cat test22.sh #!/bin/bash # testing the read -p option # read -p "Please enter your age: " age days=$[ $age * 365 ] echo "That makes you over $days days old! " # $ $ ./test22.sh Please enter your age: 10 That makes you over 3650 days old! $ ``` ä½ ä¼æ³¨æå°ï¼å¨ç¬¬ä¸ä¸ªä¾åä¸å½æååè¾å ¥æ¶ï¼read å½ä»¤ä¼å°å§ååä¿åå¨åä¸ä¸ªåéä¸ãread å½ä»¤ä¼å°æç¤ºç¬¦åè¾å ¥çæææ°æ®åé ç»å个åéï¼è¦ä¹ä½ å°±æå®å¤ä¸ªåéãè¾å ¥çæ¯ä¸ªæ°æ®å¼é½ä¼åé ç»åéå表ä¸çä¸ä¸ä¸ªåéã妿åéæ°éä¸å¤ï¼å©ä¸çæ°æ®å°±å ¨é¨åé ç»æåä¸ä¸ªåéã ```bash $ cat test23.sh #!/bin/bash # entering multiple variables # read -p "Enter your name: " first last echo "Checking data for $last, $first..." $ $ ./test23.sh Enter your name: Rich Blum Checking data for Blum, Rich... $ ``` ä¹å¯ä»¥å¨ read å½ä»¤è¡ä¸ä¸æå®åéã妿æ¯è¿æ ·ï¼read å½ä»¤ä¼å°å®æ¶å°ç任使°æ®é½æ¾è¿ç¹æ®ç¯å¢åé REPLY ä¸ã ```bash $ cat test24.sh #!/bin/bash # Testing the REPLY Environment variable # read -p "Enter your name: " echo echo Hello $REPLY, welcome to my program. # $ $ ./test24.sh Enter your name: Christine Hello Christine, welcome to my program. $ ``` REPLY ç¯å¢åéä¼ä¿åè¾å ¥çæææ°æ®ï¼å¯ä»¥å¨ shell èæ¬ä¸åå ¶ä»åé䏿 ·ä½¿ç¨ã ### è¶ æ¶ ä½¿ç¨ read å½ä»¤æ¶è¦å½å¿ãèæ¬å¾å¯è½ä¼ä¸ç´è¦ççèæ¬ç¨æ·çè¾å ¥ã妿ä¸ç®¡æ¯å¦ææ°æ®è¾å ¥ï¼èæ¬é½å¿ é¡»ç»§ç»æ§è¡ï¼ä½ å¯ä»¥ç¨-t éé¡¹æ¥æå®ä¸ä¸ªè®¡æ¶å¨ã-t é项æå®äº read å½ä»¤çå¾ è¾å ¥çç§æ°ãå½è®¡æ¶å¨è¿æåï¼read å½ä»¤ä¼è¿åä¸ä¸ªéé¶éåºç¶æç ã ```bash $ cat test25.sh #!/bin/bash # timing the data entry # if read -t 5 -p "Please enter your name: " name then echo "Hello $name, welcome to my script" else echo echo "Sorry, too slow! " fi $ $ ./test25.sh Please enter your name: Rich Hello Rich, welcome to my script $ ``` å¦æè®¡æ¶å¨è¿æï¼read å½ä»¤ä¼ä»¥éé¶éåºç¶æç éåºï¼å¯ä»¥ä½¿ç¨å¦ if-then è¯å¥æ while 循ç¯è¿ç§æ åçç»æåè¯å¥æ¥çæ¸ æåççå ·ä½æ åµã卿¬ä¾ä¸ï¼è®¡æ¶å¨è¿ææ¶ï¼if è¯å¥ä¸æç«ï¼shell 伿§è¡ else é¨åçå½ä»¤ã ä¹å¯ä»¥ä¸å¯¹è¾å ¥è¿ç¨è®¡æ¶ï¼èæ¯è®© read å½ä»¤æ¥ç»è®¡è¾å ¥çå符æ°ãå½è¾å ¥çå符达å°é¢è®¾çåç¬¦æ°æ¶ï¼å°±èªå¨éåºï¼å°è¾å ¥çæ°æ®èµç»åéã ```bash $ cat test26.sh #!/bin/bash # getting just one character of input # read -n1 -p "Do you want to continue [Y/N]? " answer case $answer in Y | y) echo echo "fine, continue on...";; N | n) echo echo OK, goodbye exit;; esac echo "This is the end of the script" $ $ ./test26.sh Do you want to continue [Y/N]? Y fine, continue on... This is the end of the script $ $ ./test26.sh Do you want to continue [Y/N]? n OK, goodbye $ ``` æ¬ä¾ä¸å°-n é项åå¼ 1 ä¸èµ·ä½¿ç¨ï¼åè¯ read å½ä»¤å¨æ¥åå个å符åéåºãåªè¦æä¸å个å符åçåï¼read å½ä»¤å°±ä¼æ¥åè¾å ¥å¹¶å°å®ä¼ ç»åéï¼æ éæå车é®ã ### éèæ¹å¼è¯»å ææ¶ä½ éè¦ä»èæ¬ç¨æ·å¤å¾å°è¾å ¥ï¼ä½åä¸å¨å±å¹ä¸æ¾ç¤ºè¾å ¥ä¿¡æ¯ãå ¶ä¸å ¸åçä¾åå°±æ¯è¾å ¥çå¯ç ï¼ä½é¤æ¤ä¹å¤è¿æå¾å¤å ¶ä»éè¦éèçæ°æ®ç±»åã -s é项å¯ä»¥é¿å å¨ read å½ä»¤ä¸è¾å ¥çæ°æ®åºç°å¨æ¾ç¤ºå¨ä¸ï¼å®é ä¸ï¼æ°æ®ä¼è¢«æ¾ç¤ºï¼åªæ¯ read å½ä»¤ä¼å°ææ¬é¢è²è®¾æè·èæ¯è²ä¸æ ·ï¼ãè¿éæä¸ªå¨èæ¬ä¸ä½¿ç¨-s é项çä¾åã ```bash $ cat test27.sh #!/bin/bash # hiding input data from the monitor # read -s -p "Enter your password: " pass echo echo "Is your password really $pass? " $ $ ./test27.sh Enter your password: Is your password really T3st1ng? $ ``` è¾å ¥æç¤ºç¬¦è¾å ¥çæ°æ®ä¸ä¼åºç°å¨å±å¹ä¸ï¼ä½ä¼èµç»åéï¼ä»¥ä¾¿å¨èæ¬ä¸ä½¿ç¨ã ### 仿件ä¸è¯»å æåï¼ä¹å¯ä»¥ç¨ read å½ä»¤æ¥è¯»å Linux ç³»ç»ä¸æä»¶éä¿åçæ°æ®ãæ¯æ¬¡è°ç¨ read å½ä»¤ï¼å®é½ä¼ä»æä»¶ä¸è¯»åä¸è¡ææ¬ã彿件ä¸å没æå 容æ¶ï¼read å½ä»¤ä¼éåºå¹¶è¿åéé¶éåºç¶æç ã å ¶ä¸æé¾çé¨åæ¯å°æä»¶ä¸çæ°æ®ä¼ ç» read å½ä»¤ãæå¸¸è§çæ¹æ³æ¯å¯¹æä»¶ä½¿ç¨ cat å½ä»¤ï¼å°ç»æéè¿ç®¡éç´æ¥ä¼ ç»å«æ read å½ä»¤ç while å½ä»¤ãä¸é¢çä¾å说ææä¹å¤çã ```bash $ cat test28.sh #!/bin/bash # reading data from a file # count=1 cat test | while read line do echo "Line $count: $line" count=$[ $count + 1] done echo "Finished processing the file" $ $ cat test The quick brown dog jumps over the lazy fox. This is a test, this is only a test. O Romeo, Romeo! Wherefore art thou Romeo? $ $ ./test28.sh Line 1: The quick brown dog jumps over the lazy fox. Line 2: This is a test, this is only a test. Line 3: O Romeo, Romeo! Wherefore art thou Romeo? Finished processing the file $ ``` while 循ç¯ä¼æç»éè¿ read å½ä»¤å¤çæä»¶ä¸çè¡ï¼ç´å° read å½ä»¤ä»¥éé¶éåºç¶æç éåºã