# åè¯èæ¬ç¼ç¨ å°ç®åä¸ºæ¢æä»¬å·²ç»ç¥éäº Linux ç³»ç»åå½ä»¤è¡çåºç¡ç¥è¯ï¼æ¯æ¶åå¼å§ç¼ç¨äºãæ¬ç« 讨论ç¼å shell èæ¬çåºç¡ç¥è¯ãå¨å¼å§ç¼åèªå·±ç shell èæ¬å¤§ä½åï¼ä½ å¿ é¡»äºè§£è¿äºåºæ¬æ¦å¿µã ## 使ç¨å¤ä¸ªå½ä»¤ å°ç®å为æ¢ï¼ä½ å·²ç»äºè§£äºå¦ä½ä½¿ç¨ shell çå½ä»¤è¡çé¢æç¤ºç¬¦æ¥è¾å ¥å½ä»¤åæ¥çå½ä»¤çç»æãshell èæ¬çå ³é®å¨äºè¾å ¥å¤ä¸ªå½ä»¤å¹¶å¤çæ¯ä¸ªå½ä»¤çç»æï¼çè³éè¦å°ä¸ä¸ªå½ä»¤çç»æä¼ ç»å¦ä¸ä¸ªå½ä»¤ãshell å¯ä»¥è®©ä½ å°å¤ä¸ªå½ä»¤ä¸²èµ·æ¥ï¼ä¸æ¬¡æ§è¡å®æã妿è¦ä¸¤ä¸ªå½ä»¤ä¸èµ·è¿è¡ï¼å¯ä»¥æå®ä»¬æ¾å¨åä¸è¡ä¸ï¼å½¼æ¤é´ç¨åå·éå¼ã ```bash $ date ; who Sun Dec 20 08:59:29 AM CST 2020 testuser tty1 2020-12-20 08:11 (:0) testuser pts/0 2020-12-20 08:11 (:0) testuser pts/1 2020-12-20 08:59 (:0) $ ``` æåï¼ä½ ååå·²ç»å好äºä¸ä¸ªèæ¬ãè¿ä¸ªç®åçèæ¬åªç¨å°äºä¸¤ä¸ª bash shell å½ä»¤ãdate å½ä»¤å è¿è¡ï¼æ¾ç¤ºäºå½åæ¥æåæ¶é´ï¼åé¢ç´§è·ç who å½ä»¤çè¾åºï¼æ¾ç¤ºå½åæ¯è°ç»å½å°äºç³»ç»ä¸ã使ç¨è¿ç§åæ³å°±è½å°ä»»æå¤ä¸ªå½ä»¤ä¸²è¿å¨ä¸èµ·ä½¿ç¨äºï¼åªè¦ä¸è¶ è¿æå¤§å½ä»¤è¡åç¬¦æ° 255 å°±è¡ã è¿ç§ææ¯å¯¹äºå°åèæ¬å°å¯ï¼ä½å®æä¸ä¸ªå¾å¤§ç缺é·ï¼æ¯æ¬¡è¿è¡ä¹åï¼ä½ é½å¿ é¡»å¨å½ä»¤æç¤ºç¬¦ä¸è¾å ¥æ´ä¸ªå½ä»¤ãå¯ä»¥å°è¿äºå½ä»¤ç»åæä¸ä¸ªç®åçææ¬æä»¶ï¼è¿æ ·å°±ä¸éè¦å¨å½ä»¤è¡ä¸æå¨è¾å ¥äºãå¨éè¦è¿è¡è¿äºå½ä»¤æ¶ï¼åªç¨è¿è¡è¿ä¸ªææ¬æä»¶å°±è¡äºã ## å建 shell èæ¬æä»¶ è¦å° shell å½ä»¤æ¾å°ææ¬æä»¶ä¸ï¼é¦å éè¦ç¨ææ¬ç¼è¾å¨æ¥å建ä¸ä¸ªæä»¶ï¼ç¶åå°å½ä»¤è¾å ¥å°æä»¶ä¸ãå¨å建 shell èæ¬æä»¶æ¶ï¼å¿ 须卿件ç第ä¸è¡æå®è¦ä½¿ç¨ç shellãå ¶æ ¼å¼ä¸ºï¼ ```bash #!/bin/bash ``` å¨é常ç shell èæ¬ä¸ï¼äºå·ï¼#ï¼ç¨ä½æ³¨éè¡ãshell å¹¶ä¸ä¼å¤ç shell èæ¬ä¸ç注éè¡ãç¶èï¼shell èæ¬æä»¶ç第ä¸è¡æ¯ä¸ªä¾å¤ï¼#åé¢çæå¹å·ä¼åè¯ shell ç¨åªä¸ª shell æ¥è¿è¡èæ¬ï¼æ¯çï¼ä½ å¯ä»¥ä½¿ç¨ bash shellï¼åæ¶è¿å¯ä»¥ä½¿ç¨å¦ä¸ä¸ª shell æ¥è¿è¡ä½ çèæ¬ï¼ã 卿å®äº shell ä¹åï¼å°±å¯ä»¥å¨æä»¶çæ¯ä¸è¡ä¸è¾å ¥å½ä»¤ï¼ç¶åå ä¸ä¸ªå车符ãä¹åæå°è¿ï¼æ³¨éå¯ç¨#æ·»å ãä¾å¦ï¼ ```bash # This script displays the date and who's logged on date who ``` è¿å°±æ¯èæ¬çææå 容äºãå¯ä»¥æ ¹æ®éè¦ï¼ä½¿ç¨åå·å°ä¸¤ä¸ªå½ä»¤æ¾å¨ä¸è¡ä¸ï¼ä½å¨ shell èæ¬ä¸ï¼ä½ å¯ä»¥å¨ç¬ç«çè¡ä¸ä¹¦åå½ä»¤ãshell ä¼ææ ¹æ®å½ä»¤å¨æä»¶ä¸åºç°ç顺åºè¿è¡å¤çã è¿æï¼è¦æ³¨æå¦æä¸è¡ä¹ä»¥#å¼å¤´ï¼å¹¶æ·»å äºä¸ä¸ªæ³¨éãshell ä¸ä¼è§£é以#å¼å¤´çè¡ï¼é¤äºä»¥#!å¼å¤´ç第ä¸è¡ï¼ãç䏿³¨éæ¥è¯´æèæ¬åäºä»ä¹ï¼è¿ç§æ¹æ³é常好ãå½ä¸¤å¹´ååè¿æ¥åçè¿ä¸ªèæ¬æ¶ï¼ä½ è¿å¯ä»¥å¾å®¹æåå¿èµ·åè¿ä»ä¹ã å°è¿ä¸ªèæ¬ä¿åå¨å为 test1 çæä»¶ä¸ï¼åºæ¬å°±å¥½äºãå¨è¿è¡æ°èæ¬åï¼è¿è¦åå ¶ä»ä¸äºäºãç°å¨è¿è¡èæ¬ï¼ç»æå¯è½ä¼å«ä½ æç¹å¤±æã ```bash $ test1 bash: test1: command not found ``` ä½ è¦è·¨è¿ç第ä¸ä¸ªéç¢æ¯è®© bash shell è½æ¾å°ä½ çèæ¬æä»¶ãå¦ä¹åæè¿°ï¼shell ä¼éè¿ PATH ç¯å¢åéæ¥æ¥æ¾å½ä»¤ãå¿«éæ¥çä¸ä¸ PATH ç¯å¢åéå°±å¯ä»¥å¼æ¸ é®é¢æå¨ã ```bash $ echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin :/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user/bin ``` PATH ç¯å¢åé被设置æåªå¨ä¸ç»ç®å½ä¸æ¥æ¾å½ä»¤ãè¦è®© shell æ¾å° test1 èæ¬ï¼åªééå以ä¸ä¸¤ç§ä½æ³ä¹ä¸ï¼ - å° shell èæ¬æä»¶æå¤çç®å½æ·»å å° PATH ç¯å¢åéä¸ï¼ - å¨æç¤ºç¬¦ä¸ç¨ç»å¯¹æç¸å¯¹æä»¶è·¯å¾æ¥å¼ç¨ shell èæ¬æä»¶ã > æäº Linux åè¡çå°$HOME/bin ç®å½æ·»å è¿äº PATH ç¯å¢åéãå®å¨æ¯ä¸ªç¨æ·ç HOME ç®å½ä¸æä¾äºä¸ä¸ªåæ¾æä»¶çå°æ¹ï¼shell å¯ä»¥å¨é£éæ¥æ¾è¦æ§è¡çå½ä»¤ã å¨è¿ä¸ªä¾åä¸ï¼æä»¬å°ç¨ç¬¬äºç§æ¹å¼å°èæ¬æä»¶çç¡®åä½ç½®åè¯ shellãè®°ä½ï¼ä¸ºäºå¼ç¨å½åç®å½ä¸çæä»¶ï¼å¯ä»¥å¨ shell ä¸ä½¿ç¨åç¹æä½ç¬¦ã ```bash $ ./test1 bash: ./test1: Permission denied ``` ç°å¨ shell æ¾å°äºèæ¬æä»¶ï¼ä½è¿æä¸ä¸ªé®é¢ãshell ææäºä½ è¿æ²¡ææ§è¡æä»¶çæéãå¿«éæ¥çä¸ä¸æä»¶æéå°±è½æ¾å°é®é¢æå¨ã ```bash $ ls -l test1 -rw-rw-r-- 1 user user 73 Sep 24 19:56 test1 ``` å¨å建 test1 æä»¶æ¶ï¼umask çå¼å³å®äºæ°æä»¶çé»è®¤æé设置ãç±äº umask åéå¨ ArchLinux ä¸è¢«è®¾æäº 022ï¼æä»¥ç³»ç»å建çæä»¶çæä»¶å±ä¸»åªæè¯»/åæéã ä¸ä¸æ¥æ¯éè¿ chmod å½ä»¤èµäºæä»¶å±ä¸»æ§è¡æä»¶çæéã ```bash $ chmod u+x test1 $ ./test1 Sun Dec 20 08:59:29 AM CST 2020 testuser tty1 2020-12-20 08:11 (:0) testuser pts/0 2020-12-20 08:11 (:0) testuser pts/1 2020-12-20 08:59 (:0) ``` æåäºï¼ ## æ¾ç¤ºæ¶æ¯ 大夿° shell å½ä»¤é½ä¼äº§çèªå·±çè¾åºï¼è¿äºè¾åºä¼æ¾ç¤ºå¨èæ¬æè¿è¡çæ§å¶å°æ¾ç¤ºå¨ä¸ãå¾å¤æ¶åï¼ä½ å¯è½æ³è¦æ·»å èªå·±çææ¬æ¶æ¯æ¥åè¯èæ¬ç¨æ·èæ¬æ£å¨åä»ä¹ãå¯ä»¥éè¿ echo å½ä»¤æ¥å®ç°è¿ä¸ç¹ãå¦æå¨ echo å½ä»¤åé¢å ä¸äºä¸ä¸ªå符串ï¼è¯¥å½ä»¤å°±è½æ¾ç¤ºåºè¿ä¸ªææ¬å符串ã ```bash $ echo This is a test This is a test ``` 注æï¼é»è®¤æ åµä¸ï¼ä¸éè¦ä½¿ç¨å¼å·å°è¦æ¾ç¤ºçææ¬å符串åå®åºæ¥ã使æ¶å¨å符串ä¸åºç°å¼å·çè¯å°±æ¯è¾éº»ç¦äºã ``` $ echo Let's see if this'll work Lets see if thisll work ``` echo å½ä»¤å¯ç¨åå¼å·æåå¼å·æ¥å宿æ¬å符串ã妿å¨å符串ä¸ç¨å°äºå®ä»¬ï¼ä½ éè¦å¨ææ¬ä¸ä½¿ç¨å ¶ä¸ä¸ç§å¼å·ï¼èç¨å¦å¤ä¸ç§æ¥å°å符串åå®èµ·æ¥ã ``` $ echo "This is a test to see if you're paying attention" This is a test to see if you're paying attention $ echo 'Rich says "scripting is easy".' Rich says "scripting is easy". ``` ææçå¼å·é½å¯ä»¥æ£å¸¸è¾åºäºã å¦ææ³æææ¬å符串åå½ä»¤è¾åºæ¾ç¤ºå¨åä¸è¡ä¸ï¼è¯¥æä¹åå¢ï¼å¯ä»¥ç¨ echo è¯å¥ç-n åæ°ãåªè¦å°ç¬¬ä¸ä¸ª echo è¯å¥æ¹æè¿æ ·å°±è¡ï¼ ```bash echo -n "The time and date are: " date #è¾åº: The time and date are: Mon Feb 21 15:42:23 EST 2014 ``` å®ç¾ï¼echo å½ä»¤æ¯ shell èæ¬ä¸ä¸ç¨æ·äº¤äºçéè¦å·¥å ·ãä½ ä¼åç°å¨å¾å¤å°æ¹é½è½ç¨å°å®ï¼å°¤å ¶æ¯éè¦æ¾ç¤ºèæ¬ä¸åéçå¼çæ¶åãæä»¬ä¸é¢ç»§ç»äºè§£è¿ä¸ªã ## 使ç¨åé è¿è¡ shell èæ¬ä¸çå个å½ä»¤èªç¶æç¨ï¼ä½è¿æå ¶èªèº«çéå¶ãéå¸¸ä½ ä¼éè¦å¨ shell å½ä»¤ä½¿ç¨å ¶ä»æ°æ®æ¥å¤çä¿¡æ¯ãè¿å¯ä»¥éè¿å鿥å®ç°ãåéå è®¸ä½ ä¸´æ¶æ§å°å°ä¿¡æ¯åå¨å¨ shell èæ¬ä¸ï¼ä»¥ä¾¿åèæ¬ä¸çå ¶ä»å½ä»¤ä¸èµ·ä½¿ç¨ãæ¬èå°ä»ç»å¦ä½å¨ shell èæ¬ä¸ä½¿ç¨åéã ### ç¯å¢åé ä½ å·²ç»çå°è¿ Linux çä¸ç§åéå¨å®é ä¸çåºç¨ãåé¢ä»ç»äº Linux ç³»ç»çç¯å¢åéãä¹å¯ä»¥å¨èæ¬ä¸è®¿é®è¿äºå¼ãshell ç»´æ¤çä¸ç»ç¯å¢åéï¼ç¨æ¥è®°å½ç¹å®çç³»ç»ä¿¡æ¯ãæ¯å¦ç³»ç»çåç§°ãç»å½å°ç³»ç»ä¸çç¨æ·åãç¨æ·çç³»ç» IDï¼ä¹ç§°ä¸º UIDï¼ãç¨æ·çé»è®¤ä¸»ç®å½ä»¥å shell æ¥æ¾ç¨åºçæç´¢è·¯å¾ãå¯ä»¥ç¨ set å½ä»¤æ¥æ¾ç¤ºä¸ä»½å®æ´çå½åç¯å¢åéå表ã ```bash $ set BASH=/bin/bash [...] HOME=/home/Samantha HOSTNAME=localhost.localdomain HOSTTYPE=i386 IFS=$' \t\n' LANG=en_US.utf8 LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=24 LOGNAME=Samantha [...] ``` å¨èæ¬ä¸ï¼ä½ å¯ä»¥å¨ç¯å¢åéåç§°ä¹åå ä¸ç¾å 符ï¼$ï¼æ¥ä½¿ç¨è¿äºç¯å¢åéãä¸é¢çèæ¬æ¼ç¤ºäºè¿ç§ç¨æ³ã ```bash $ cat test2 #!/bin/bash # display user information from the system. echo "User info for userid: $USER" #è¥ä¸ºåå¼å·å 裹åä¸ä¼åæ´$USERçå¼ echo UID: $UID echo HOME: $HOME $ ``` $USERã$UID å$HOME ç¯å¢åéç¨æ¥æ¾ç¤ºå·²ç»å½ç¨æ·çæå ³ä¿¡æ¯ãèæ¬è¾åºå¦ä¸ï¼ ```bash $ chmod u+x test2 $ ./test2 User info for userid: Samantha UID: 1001 HOME: /home/Samantha ``` > ä½ å¯è½è¿è§è¿éè¿${variable}å½¢å¼å¼ç¨çåéãåéå两侧é¢å¤çè±æ¬å·éå¸¸ç¨æ¥å¸®å©è¯å«ç¾å 符åçåéåã æ³¨æï¼echo å½ä»¤ä¸çç¯å¢åéä¼å¨èæ¬è¿è¡æ¶æ¿æ¢æå½åå¼ãå¦å¤ï¼å¨ç¬¬ä¸ä¸ªå符串ä¸å¯ä»¥å°$USER ç³»ç»åéæ¾ç½®å°åå¼å·ä¸ï¼è shell ä¾ç¶è½å¤ç¥éæä»¬çæå¾ãä½éç¨è¿ç§æ¹æ³ä¹æä¸ä¸ªé®é¢ãççä¸é¢è¿ä¸ªä¾å伿乿 ·ã ```bash $ echo "The cost of the item is $15" The cost of the item is 5 ``` æ¾ç¶è¿ä¸æ¯æä»¬æ³è¦çãåªè¦èæ¬å¨å¼å·ä¸åºç°ç¾å 符ï¼å®å°±ä¼ä»¥ä¸ºä½ å¨å¼ç¨ä¸ä¸ªåéãå¨è¿ä¸ªä¾åä¸ï¼èæ¬ä¼å°è¯æ¾ç¤ºåé$1ï¼ä½å¹¶æªå®ä¹ï¼ï¼åæ¾ç¤ºæ°å 5ãè¦æ¾ç¤ºç¾å 符ï¼ä½ å¿ é¡»å¨å®å颿¾ç½®ä¸ä¸ªåæçº¿ã ```bash $ echo "The cost of the item is \$15" The cost of the item is $15 ``` çèµ·æ¥å¥½å¤äºãåæçº¿å 许 shell èæ¬å°ç¾å 符解读为å®é çç¾å 符ï¼è䏿¯åéãä¸ä¸èå°ä¼ä»ç»å¦ä½å¨èæ¬ä¸å建èªå·±çåéã ### ç¨æ·åé é¤äºç¯å¢åéï¼shell èæ¬è¿å 许å¨èæ¬ä¸å®ä¹å使ç¨èªå·±çåéãå®ä¹åéå 许临æ¶å卿°æ®å¹¶å¨æ´ä¸ªèæ¬ä¸ä½¿ç¨ï¼ä»è使 shell èæ¬çèµ·æ¥æ´åä¸ä¸ªçæ£çè®¡ç®æºç¨åºãç¨æ·åéå¯ä»¥æ¯ä»»ä½ç±åæ¯ãæ°åæä¸åçº¿ç»æçææ¬å符串ï¼é¿åº¦ä¸è¶ è¿ 20 个ãç¨æ·åéåºå大å°åï¼æä»¥åé Var1 ååé var1 æ¯ä¸åçãè¿ä¸ªå°è§ç©ç»å¸¸è®©èæ¬ç¼ç¨åå¦è æå°å¤´ç¼ã 使ç¨çå·å°å¼èµç»ç¨æ·åéãå¨åéãçå·åå¼ä¹é´ä¸è½åºç°ç©ºæ ¼ï¼å¦ä¸ä¸ªå°æ°åå¦è çç¨æ³ï¼ãè¿éæä¸äºç»ç¨æ·åéèµå¼çä¾åã ```bash var1=10 var2=-57 var3=testing var4="still more testing" ``` shell èæ¬ä¼èªå¨å³å®åéå¼çæ°æ®ç±»åãå¨èæ¬çæ´ä¸ªçå½å¨æéï¼shell èæ¬ä¸å®ä¹çåéä¼ä¸ç´ä¿æçå®ä»¬çå¼ï¼ä½å¨ shell èæ¬ç»ææ¶ä¼è¢«å 餿ã ä¸ç³»ç»åé类似ï¼ç¨æ·åéå¯éè¿ç¾å 符å¼ç¨ãåéæ¯æ¬¡è¢«å¼ç¨æ¶ï¼é½ä¼è¾åºå½åèµç»å®çå¼ãéè¦çæ¯è¦è®°ä½ï¼å¼ç¨ä¸ä¸ªåé弿¶éè¦ä½¿ç¨ç¾å 符ï¼èå¼ç¨åéæ¥å¯¹å ¶è¿è¡èµå¼æ¶åä¸è¦ä½¿ç¨ç¾å 符ãéè¿ä¸ä¸ªä¾åä½ å°±è½æç½æçææã ```bash $ cat test4 #!/bin/bash # assigning a variable value to another variable value1=10 value2=$value1 echo The resulting value is $value2 ``` å¨èµå¼è¯å¥ä¸ä½¿ç¨ value1 åéç弿¶ï¼ä»ç¶å¿ é¡»ç¨ç¾å 符ãè¿æ®µä»£ç 产çå¦ä¸è¾åºã ```bash $ chmod u+x test4 $ ./test4 The resulting value is 10 ``` è¦æ¯å¿äºç¨ç¾å 符ï¼ä½¿å¾ value2 çèµå¼è¡åæäºè¿æ ·ï¼ ```bash value2=value1 ``` é£ä½ ä¼å¾å°å¦ä¸è¾åºï¼ ```bash $ ./test4 The resulting value is value1 ``` 没æç¾å 符ï¼shell ä¼å°åéåè§£éææ®éçææ¬å符串ï¼é常è¿å¹¶ä¸æ¯ä½ æ³è¦çç»æã ### å½ä»¤æ¿æ¢ shell èæ¬ä¸ææç¨çç¹æ§ä¹ä¸å°±æ¯å¯ä»¥ä»å½ä»¤è¾åºä¸æåä¿¡æ¯ï¼å¹¶å°å ¶èµç»åéãæè¾åºèµç»åéä¹åï¼å°±å¯ä»¥éæå¨èæ¬ä¸ä½¿ç¨äºãè¿ä¸ªç¹æ§å¨å¤çèæ¬æ°æ®æ¶å°¤ä¸ºæ¹ä¾¿ã æä¸¤ç§æ¹æ³å¯ä»¥å°å½ä»¤è¾åºèµç»åéï¼ - åå¼å·å符(\`) testing=\`date\` - $()æ ¼å¼ testing=$(date) shell ä¼è¿è¡å½ä»¤æ¿æ¢ç¬¦å·ä¸çå½ä»¤ï¼å¹¶å°å ¶è¾åºèµç»åé testingãæ³¨æï¼èµå¼çå·åå½ä»¤æ¿æ¢å符ä¹é´æ²¡æç©ºæ ¼ã ä¸é¢è¿ä¸ªä¾åå¾å¸¸è§ï¼å®å¨èæ¬ä¸éè¿å½ä»¤æ¿æ¢è·å¾å½åæ¥æå¹¶ç¨å®æ¥çæå¯ä¸æä»¶åã ```bash #!/bin/bash # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d) ls /usr/bin -al > log.$today ``` today åé被èµäºæ ¼å¼ååç date å½ä»¤çè¾åºãè¿æ¯æåæ¥æä¿¡æ¯æ¥çææ¥å¿æä»¶å常ç¨çä¸ç§ææ¯ã+%y%m%d æ ¼å¼åè¯ date å½ä»¤å°æ¥ææ¾ç¤ºä¸ºä¸¤ä½æ°çå¹´ææ¥çç»åã ```bash $ date +%y%m%d 201220 ``` è¿ä¸ªèæ¬å°æ¥æå¼èµç»ä¸ä¸ªåéï¼ä¹ååå°å ¶ä½ä¸ºæä»¶åçä¸é¨åãæä»¶èªèº«å«æ/usr/bin ç®å½å表çéå®åè¾åºï¼å°å¨åç»è¯¦ç»è®¨è®ºï¼ãè¿è¡è¯¥èæ¬ä¹åï¼åºè¯¥è½å¨ç®å½ä¸çå°ä¸ä¸ªæ°æä»¶ã ```bash -rw-r--r-- 1 user user 769 Jan 31 10:15 log.140131 ``` ç®å½ä¸åºç°çæ¥å¿æä»¶éç¨$today åéçå¼ä½ä¸ºæä»¶åçä¸é¨åãæ¥å¿æä»¶çå 容æ¯/usr/bin ç®å½å 容çå表è¾åºãå¦æèæ¬å¨æå¤©è¿è¡ï¼æ¥å¿æä»¶å伿¯ log.201221ï¼å°±è¿æ ·ä¸ºæ°çä¸å¤©å建ä¸ä¸ªæ°æä»¶ã > å½ä»¤æ¿æ¢ä¼å建ä¸ä¸ªå shell æ¥è¿è¡å¯¹åºçå½ä»¤ãå shellï¼subshellï¼æ¯ç±è¿è¡è¯¥èæ¬ç shell æåå»ºåºæ¥çä¸ä¸ªç¬ç«çå shellï¼child shellï¼ãæ£å 妿¤ï¼ç±è¯¥å shell ææ§è¡å½ä»¤æ¯æ æ³ä½¿ç¨èæ¬ä¸æå建çåéçã ## éå®åè¾å ¥åè¾åº æäºæ¶åä½ æ³è¦ä¿åæä¸ªå½ä»¤çè¾åºèä¸ä» ä» åªæ¯è®©å®æ¾ç¤ºå¨æ¾ç¤ºå¨ä¸ãbash shell æä¾äºå 个æä½ç¬¦ï¼å¯ä»¥å°å½ä»¤çè¾åºéå®åå°å¦ä¸ä¸ªä½ç½®ï¼æ¯å¦æä»¶ï¼ãéå®åå¯ä»¥ç¨äºè¾å ¥ï¼ä¹å¯ä»¥ç¨äºè¾åºï¼å¯ä»¥å°æä»¶éå®åå°å½ä»¤è¾å ¥ã ### è¾åºéå®å æåºæ¬çéå®åå°å½ä»¤çè¾åºåéå°ä¸ä¸ªæä»¶ä¸ãbash shell ç¨å¤§äºå·ï¼>ï¼æ¥å®æè¿é¡¹åè½ï¼ä¹åæ¾ç¤ºå¨ä¸åºç°çå½ä»¤è¾åºä¼è¢«ä¿åå°æå®çè¾åºæä»¶ä¸ã ```bash $ date > test6 $ ls -l test6 -rw-r--r-- 1 user user 29 Feb 10 17:56 test6 $ cat test6 Thu Feb 10 17:56:58 EDT 2020 ``` éå®åæä½ç¬¦å建äºä¸ä¸ªæä»¶ test6ï¼éè¿é»è®¤ç umask 设置ï¼ï¼å¹¶å° date å½ä»¤çè¾åºéå®åå°è¯¥æä»¶ä¸ã妿è¾åºæä»¶å·²ç»åå¨äºï¼éå®åæä½ç¬¦ä¼ç¨æ°çæä»¶æ°æ®è¦çå·²ææä»¶ã ææ¶ï¼ä½ å¯è½å¹¶ä¸æ³è¦çæä»¶åæå 容ï¼èæ¯æ³è¦å°æ°å½ä»¤çè¾åºè¿½å å°å·²ææä»¶å 容çåé¢ï¼æ¯å¦ä½ æ£å¨å建ä¸ä¸ªè®°å½ç³»ç»ä¸æä¸ªæä½çæ¥å¿æä»¶ãå¨è¿ç§æ åµä¸ï¼å¯ä»¥ç¨å大äºå·ï¼>>ï¼æ¥è¿½å æ°æ®ã ```bash $ who > test6 $ date >> test6 $ cat test6 user pts/0 Feb 10 17:55 Thu Feb 10 18:02:14 EDT 2020 ``` test6 æä»¶ä»ç¶å 嫿©äºæ¶å who å½ä»¤çæ°æ®ï¼ç°å¨åå ä¸äºæ¥èª date å½ä»¤çè¾åºã ### è¾å ¥éå®å è¾å ¥éå®ååè¾åºéå®åæ£å¥½ç¸åãè¾å ¥éå®åå°æä»¶çå 容éå®åå°å½ä»¤ï¼èéå°å½ä»¤çè¾åºéå®åå°æä»¶ãè¾å ¥éå®åç¬¦å·æ¯å°äºå·ï¼<ï¼ã ä¸ä¸ªç®åçè®°å¿æ¹æ³å°±æ¯ï¼å¨å½ä»¤è¡ä¸ï¼å½ä»¤æ»æ¯å¨å·¦ä¾§ï¼èéå®å符å·âæåâæ°æ®æµå¨çæ¹åãå°äºå·è¯´ææ°æ®æ£å¨ä»è¾å ¥æä»¶æµåå½ä»¤ãè¿éæä¸ªå wc å½ä»¤ä¸èµ·ä½¿ç¨è¾å ¥éå®åçä¾åã ```bash $ wc < test6 2 11 60 $ ``` wc å½ä»¤å¯ä»¥å¯¹å¯¹æ°æ®ä¸çææ¬è¿è¡è®¡æ°ãé»è®¤æ åµä¸ï¼å®ä¼è¾åº 3 个å¼ï¼ - ææ¬çè¡æ° - ææ¬çè¯æ° - ææ¬çåèæ° éè¿å°ææ¬æä»¶éå®åå° wc å½ä»¤ï¼ä½ ç«å»å°±å¯ä»¥å¾å°æä»¶ä¸çè¡ãè¯ååèç计æ°ãè¿ä¸ªä¾å说æ test6 æä»¶æ 2 è¡ã11 个åè¯ä»¥å 60 åèã è¿æå¦å¤ä¸ç§è¾å ¥éå®åçæ¹æ³ï¼ç§°ä¸º`å èè¾å ¥éå®å`ï¼inline input redirectionï¼ãè¿ç§æ¹æ³æ éä½¿ç¨æä»¶è¿è¡éå®åï¼åªéè¦å¨å½ä»¤è¡ä¸æå®ç¨äºè¾å ¥éå®åçæ°æ®å°±å¯ä»¥äºãä¹çä¸ç¼ï¼è¿å¯è½æç¹å¥æªï¼ä½æäºåºç¨ä¼ç¨å°è¿ç§æ¹å¼ã å èè¾å ¥éå®åç¬¦å·æ¯è¿å°äºå·ï¼<<ï¼ãé¤äºè¿ä¸ªç¬¦å·ï¼ä½ å¿ é¡»æå®ä¸ä¸ªææ¬æ è®°æ¥ååè¾å ¥æ°æ®çå¼å§åç»å°¾ãä»»ä½å符串é½å¯ä½ä¸ºææ¬æ è®°ï¼ä½å¨æ°æ®çå¼å§åç»å°¾ææ¬æ è®°å¿ é¡»ä¸è´ã å¨å½ä»¤è¡ä¸ä½¿ç¨å èè¾å ¥éå®åæ¶ï¼shell ä¼ç¨ PS2 ç¯å¢åéä¸å®ä¹ç次æç¤ºç¬¦ï¼å³'>'符å·ï¼æ¥æç¤ºè¾å ¥æ°æ®ãä¸é¢æ¯å®çä½¿ç¨æ åµã ```bash $ wc << EOF > test string 1 > test string 2 > test string 3 > EOF 3 9 42 $ ``` 次æç¤ºç¬¦ä¼æç»æç¤ºï¼ä»¥è·åæ´å¤çè¾å ¥æ°æ®ï¼ç´å°ä½ è¾å ¥äºä½ä¸ºææ¬æ è®°çé£ä¸ªå符串ãwc å½ä»¤ä¼å¯¹å èè¾å ¥éå®åæä¾çæ°æ®è¿è¡è¡ãè¯ååè计æ°ã ## ç®¡é ææ¶éè¦å°ä¸ä¸ªå½ä»¤çè¾åºä½ä¸ºå¦ä¸ä¸ªå½ä»¤çè¾å ¥ãè¿å¯ä»¥ç¨éå®åæ¥å®ç°ï¼åªæ¯æäºç¬¨æã ```bash $ rpm -qa > rpm.list $ sort < rpm.list abrt-1.1.14-1.fc14.i686 abrt-addon-ccpp-1.1.14-1.fc14.i686 abrt-addon-kerneloops-1.1.14-1.fc14.i686 abrt-addon-python-1.1.14-1.fc14.i686 ... ``` rpm å½ä»¤éè¿ Red Hat å 管çç³»ç»ï¼RPMï¼å¯¹ç³»ç»ï¼æ¯å¦ä¸ä¾ä¸ç Fedora ç³»ç»ï¼ä¸å®è£ ç软件å è¿è¡ç®¡çãé å-qa éé¡¹ä½¿ç¨æ¶ï¼å®ä¼çæå·²å®è£ å çå表ï¼ä½è¿ä¸ªå表并ä¸ä¼éµå¾ªæç§ç¹å®ç顺åºãå¦æä½ å¨æ¥æ¾æä¸ªææç»ç¹å®çå ï¼æ³å¨ rpm å½ä»¤çè¾åºä¸æ¾å°å°±æ¯è¾å°é¾äºã è¿æ åè¾åºéå®åï¼rpm å½ä»¤çè¾åºè¢«éå®åå°äºæä»¶ rpm.listãå½ä»¤å®æåï¼rpm.list ä¿åçç³»ç»ä¸ææå·²å®è£ ç软件å åè¡¨ãæ¥ä¸æ¥ï¼è¾å ¥éå®åå° rpm.list æä»¶çå 容åéç» sort å½ä»¤ï¼è¯¥å½ä»¤æåæ¯é¡ºåºå¯¹è½¯ä»¶å åç§°è¿è¡æåºã è¿ç§æ¹æ³ç确管ç¨ï¼ä½ä»ç¶æ¯ä¸ç§æ¯è¾ç¹ççä¿¡æ¯çææ¹å¼ãæä»¬ç¨ä¸çå°å½ä»¤è¾åºéå®åå°æä»¶ä¸ï¼å¯ä»¥å°å ¶ç´æ¥éå®åå°å¦ä¸ä¸ªå½ä»¤ãè¿ä¸ªè¿ç¨å«ä½`管éè¿æ¥`ï¼pipingï¼ã管é被æ¾å¨å½ä»¤ä¹é´ï¼å°ä¸ä¸ªå½ä»¤çè¾åºéå®åå°å¦ä¸ä¸ªå½ä»¤ä¸ï¼ ```bash command1 | command2 ``` ä¸è¦ä»¥ä¸ºç±ç®¡é串起ç两个å½ä»¤ä¼ä¾æ¬¡æ§è¡ãLinux ç³»ç»å®é ä¸ä¼åæ¶è¿è¡è¿ä¸¤ä¸ªå½ä»¤ï¼å¨ç³»ç»å é¨å°å®ä»¬è¿æ¥èµ·æ¥ãå¨ç¬¬ä¸ä¸ªå½ä»¤äº§çè¾åºçåæ¶ï¼è¾åºä¼è¢«ç«å³éç»ç¬¬äºä¸ªå½ä»¤ãæ°æ®ä¼ è¾ä¸ä¼ç¨å°ä»»ä½ä¸é´æä»¶æç¼å²åºã ç°å¨ï¼å¯ä»¥å©ç¨ç®¡éå° rpm å½ä»¤çè¾åºéå ¥ sort å½ä»¤æ¥äº§çç»æã ```bash rpm -qa | sort ``` é¤éä½ çç¼ç¥ç¹å«å¥½ï¼å¦åå¯è½æ ¹æ¬æ¥ä¸åçæ¸ æ¥å½ä»¤çè¾åºãç±äºç®¡éæä½æ¯å®æ¶è¿è¡çï¼æä»¥åªè¦ rpm å½ä»¤ä¸è¾åºæ°æ®ï¼sort å½ä»¤å°±ä¼ç«å³å¯¹å ¶è¿è¡æåºãçå° rpm å½ä»¤è¾åºå®æ°æ®ï¼sort å½ä»¤å°±å·²ç»å°æ°æ®æå¥½åºå¹¶æ¾ç¤ºäºå¨æ¾ç¤ºå¨ä¸ã å¯ä»¥å¨ä¸æ¡å½ä»¤ä¸ä½¿ç¨ä»»æå¤æ¡ç®¡éãå¯ä»¥æç»å°å°å½ä»¤çè¾åºéè¿ç®¡éä¼ ç»å ¶ä»å½ä»¤æ¥ç»åæä½ã å¨è¿ä¸ªä¾åä¸ï¼sort å½ä»¤çè¾åºä¼ä¸éªèè¿ï¼æä»¥å¯ä»¥ç¨ä¸æ¡ææ¬å页å½ä»¤ï¼ä¾å¦ less æ moreï¼æ¥å¼ºè¡å°è¾åºæå±æ¾ç¤ºã ```bash $ rpm -qa | sort | more ``` è¿è¡å½ä»¤åºåä¼å æ§è¡ rpm å½ä»¤ï¼å°å®çè¾åºéè¿ç®¡éä¼ ç» sort å½ä»¤ï¼ç¶ååå° sort çè¾åºéè¿ç®¡éä¼ ç» more å½ä»¤æ¥æ¾ç¤ºï¼å¨æ¾ç¤ºå®ä¸å±ä¿¡æ¯åå䏿¥ãè¿æ ·ä½ å°±å¯ä»¥å¨ç»§ç»å¤çåå䏿¥é 读æ¾ç¤ºå¨ä¸æ¾ç¤ºçä¿¡æ¯ã 妿æ³è¦æ´å«è´ç¹ï¼ä¹å¯ä»¥æé 使ç¨éå®ååç®¡éæ¥å°è¾åºä¿åå°æä»¶ä¸ã ```bash $ rpm -qa | sort > rpm.list ``` ä¸åºææï¼rpm.list æä»¶ä¸çæ°æ®ç°å¨å·²ç»æå¥½åºäºã å°ç®å为æ¢ï¼ç®¡éææµè¡çç¨æ³ä¹ä¸æ¯å°å½ä»¤äº§çç大éè¾åºéè¿ç®¡éä¼ éç» more å½ä»¤ãè¿å¯¹ ls å½ä»¤æ¥è¯´å°¤ä¸ºå¸¸è§ï¼ls -l å½ä»¤äº§çäºç®å½ä¸æææä»¶çé¿å表ã对å å«å¤§éæä»¶çç®å½æ¥è¯´ï¼è¿ä¸ªå表ä¼ç¸å½é¿ãéè¿å°è¾åºç®¡éè¿æ¥å° more å½ä»¤ï¼å¯ä»¥å¼ºå¶è¾åºå¨ä¸å±æ°æ®æ¾ç¤ºåå䏿¥ã ## æ§è¡æ°å¦è¿ç® å¦ä¸ä¸ªå¯¹ä»»ä½ç¼ç¨è¯è¨é½å¾éè¦çç¹æ§æ¯æä½æ°åçè½åãéæ¾çæ¯ï¼å¯¹ shell èæ¬æ¥è¯´ï¼è¿ä¸ªå¤çè¿ç¨ä¼æ¯è¾éº»ç¦ãå¨ shell èæ¬ä¸æä¸¤ç§é徿¥è¿è¡æ°å¦è¿ç®ã ### expr å½ä»¤ æå¼å§ï¼Bourne shell æä¾äºä¸ä¸ªç¹å«çå½ä»¤ç¨æ¥å¤çæ°å¦è¡¨è¾¾å¼ãexpr å½ä»¤å 许å¨å½ä»¤è¡ä¸å¤çæ°å¦è¡¨è¾¾å¼ï¼ä½æ¯ç¹å«ç¬¨æã ```bash $ expr 1 + 5 6 ``` expr å½ä»¤è½å¤è¯å«å°æ°çæ°å¦åå符串æä½ç¬¦ã尽管æ åæä½ç¬¦å¨ expr å½ä»¤ä¸å·¥ä½å¾å¾å¥½ï¼ä½å¨èæ¬æå½ä»¤è¡ä¸ä½¿ç¨å®ä»¬æ¶ä»æé®é¢åºç°ãè®¸å¤ expr å½ä»¤æä½ç¬¦å¨ shell ä¸å¦æå«ä¹ï¼æ¯å¦æå·ï¼ãå½å®ä»¬åºç°å¨å¨ expr å½ä»¤ä¸æ¶ï¼ä¼å¾å°ä¸äºè¯¡å¼çç»æã ```bash $ expr 5 * 2 expr: syntax error ``` è¦è§£å³è¿ä¸ªé®é¢ï¼å¯¹äºé£äºå®¹æè¢« shell é误解éçå符ï¼å¨å®ä»¬ä¼ å ¥ expr å½ä»¤ä¹åï¼éè¦ä½¿ç¨ shell ç转ä¹å符ï¼åæçº¿ï¼å°å ¶æ åºæ¥ã ```bash $ expr 5 \* 2 10 ``` ç°å¨ï¼éº»ç¦æååå¼å§ï¼å¨ shell èæ¬ä¸ä½¿ç¨ expr å½ä»¤ä¹åæ ·å¤æï¼ ```bash $ cat test6 #!/bin/bash # An example of using the expr command var1=10 var2=20 var3=$(expr $var2 / $var1) #å½ä»¤æ¿æ¢çæ¹å¼ echo The result is $var3 ``` è¦å°ä¸ä¸ªæ°å¦ç®å¼çç»æèµç»ä¸ä¸ªåéï¼éè¦ä½¿ç¨å½ä»¤æ¿æ¢æ¥è·å expr å½ä»¤çè¾åºï¼ ```bash $ chmod u+x test6 $ ./test6 The result is 2 ``` 幸好 bash shell æä¸ä¸ªé对å¤çæ°å¦è¿ç®ç¬¦çæ¹è¿ï¼é£å°±æ¯æ¹æ¬å·ã ### ä½¿ç¨æ¹æ¬å· bash shell 为äºä¿æè· Bourne shell çå ¼å®¹èå å«äº expr å½ä»¤ï¼ä½å®åæ ·ä¹æä¾äºä¸ç§æ´ç®åçæ¹æ³æ¥æ§è¡æ°å¦è¡¨è¾¾å¼ãå¨ bash ä¸ï¼å¨å°ä¸ä¸ªæ°å¦è¿ç®ç»æèµç»æä¸ªåéæ¶ï¼å¯ä»¥ç¨ç¾å ç¬¦åæ¹æ¬å·ï¼$[ operation ]ï¼å°æ°å¦è¡¨è¾¾å¼å´èµ·æ¥ã ```bash $ var1=$[1 + 5] $ echo $var1 6 $ var2=$[$var1 * 2] $ echo $var2 12 $ ``` ç¨æ¹æ¬å·æ§è¡ shell æ°å¦è¿ç®æ¯ç¨ expr å½ä»¤æ¹ä¾¿å¾å¤ãè¿ç§ææ¯ä¹éç¨äº shell èæ¬ã ```bash $ cat test7 #!/bin/bash var1=100 var2=50 var3=45 var4=$[$var1 * ($var2 - $var3)] echo The final result is $var4 #The final result is 500 ``` åæ ·ï¼æ³¨æå¨ä½¿ç¨æ¹æ¬å·æ¥è®¡ç®å ¬å¼æ¶ï¼ä¸ç¨æ å¿ shell ä¼è¯¯è§£ä¹å·æå ¶ä»ç¬¦å·ãshell ç¥éå®ä¸æ¯éé 符ï¼å 为å®å¨æ¹æ¬å·å ã å¨ bash shell èæ¬ä¸è¿è¡ç®æ¯è¿ç®ä¼æä¸ä¸ªä¸»è¦çéå¶ã请çä¸ä¾ï¼ ```bash $ cat test8 #!/bin/bash var1=100 var2=45 var3=$[$var1 / $var2] echo The final result is $var3 #The final result is 2 $ ``` bash shell æ°å¦è¿ç®ç¬¦åªæ¯ææ´æ°è¿ç®ãè¥è¦è¿è¡ä»»ä½å®é çæ°å¦è®¡ç®ï¼è¿æ¯ä¸ä¸ªå·¨å¤§çéå¶ã > z shellï¼zshï¼æä¾äºå®æ´çæµ®ç¹æ°ç®æ¯æä½ã妿éè¦å¨ shell èæ¬ä¸è¿è¡æµ®ç¹æ°è¿ç®ï¼å¯ä»¥èèçç z shellã ### æµ®ç¹è§£å³æ¹æ¡ æå ç§è§£å³æ¹æ¡è½å¤å æ bash 䏿°å¦è¿ç®çæ´æ°éå¶ãæå¸¸è§çæ¹æ¡æ¯ç¨å 建ç bash 计ç®å¨ï¼å«ä½ bcã bash 计ç®å¨å®é 䏿¯ä¸ç§ç¼ç¨è¯è¨ï¼å®å 许å¨å½ä»¤è¡ä¸è¾å ¥æµ®ç¹è¡¨è¾¾å¼ï¼ç¶åè§£é并计ç®è¯¥è¡¨è¾¾å¼ï¼æåè¿åç»æãbash 计ç®å¨è½å¤è¯å«ï¼ - æ°åï¼æ´æ°åæµ®ç¹æ°ï¼ - åéï¼ç®ååéåæ°ç»ï¼ - 注éï¼ä»¥#æ C è¯è¨ä¸ç/\* \*/å¼å§çè¡ï¼ - è¡¨è¾¾å¼ - ç¼ç¨è¯å¥ï¼ä¾å¦ if-then è¯å¥ï¼ - 彿° å¯ä»¥å¨ shell æç¤ºç¬¦ä¸éè¿ bc å½ä»¤è®¿é® bash 计ç®å¨ï¼ ```bash $ bc bc 1.07.1 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 12 * 5.4 64.8 3.156 * (3 + 5) 25.248 quit $ ``` æµ®ç¹è¿ç®æ¯ç±å 建åé scale æ§å¶çãå¿ é¡»å°è¿ä¸ªå¼è®¾ç½®ä¸ºä½ 叿å¨è®¡ç®ç»æä¸ä¿ççå°æ°ä½æ°ï¼å¦åæ æ³å¾å°ææçç»æã ```bash $ bc -q 3.44 / 5 0 scale=4 3.44 / 5 .6880 quit $ ``` scale åéçé»è®¤å¼æ¯ 0ãå¨ scale å¼è¢«è®¾ç½®åï¼bash 计ç®å¨ç计ç®ç»æä¸å å«å°æ°ä½ãå¨å°å ¶å¼è®¾ç½®æ 4 åï¼bash 计ç®å¨æ¾ç¤ºçç»æå å«åä½å°æ°ã-q å½ä»¤è¡é项å¯ä»¥ä¸æ¾ç¤º bash 计ç®å¨åé¿ç欢è¿ä¿¡æ¯ã é¤äºæ®éæ°åï¼bash 计ç®å¨è¿è½æ¯æåéã ```bash $ bc -q var1=10 var1 * 4 40 var2 = var1 / 5 print var2 2 quit $ ``` åé䏿¦è¢«å®ä¹ï¼ä½ å°±å¯ä»¥å¨æ´ä¸ª bash 计ç®å¨ä¼è¯ä¸ä½¿ç¨è¯¥åéäºãprint è¯å¥å è®¸ä½ æå°åéåæ°åã --- ç°å¨ä½ å¯è½æ³é® bash 计ç®å¨æ¯å¦ä½å¨ shell èæ¬ä¸å¸®å©å¤çæµ®ç¹è¿ç®çãè¿è®°å¾å½ä»¤æ¿æ¢åï¼æ¯çï¼å¯ä»¥ç¨å½ä»¤æ¿æ¢è¿è¡ bc å½ä»¤ï¼å¹¶å°è¾åºèµç»ä¸ä¸ªåéã ```bash $ cat test9 #!/bin/bash var1=$(echo "scale=4; 3.44 / 5" | bc) echo The answer is $var1 #The answer is .6880 ``` ä¹å¯ä»¥ç¨ shell èæ¬ä¸å®ä¹å¥½çåéè¿è¡è¿ç®ï¼ ```bash $ cat test10 #!/bin/bash var1=100 var2=45 var3=$(echo "scale=4; $var1 / $var2" | bc) echo The answer for this is $var3 #The answer for this is 2.2222 ``` å½ç¶ï¼ä¸æ¦åé被èµå¼ï¼é£ä¸ªåéä¹å¯ä»¥ç¨äºå ¶ä»è¿ç®ã ```bash $ cat test11 #!/bin/bash var1=20 var2=3.14159 var3=$(echo "scale=4; $var1 * $var1" | bc) var4=$(echo "scale=4; $var3 * $var2" | bc) echo The final result is $var4 $ ``` è¿ä¸ªæ¹æ³éç¨äºè¾ççè¿ç®ï¼ä½ææ¶ä½ 伿¶åæ´å¤çæ°åã妿éè¦è¿è¡å¤§éè¿ç®ï¼å¨ä¸ä¸ªå½ä»¤è¡ä¸ååºå¤ä¸ªè¡¨è¾¾å¼å°±ä¼æç¹éº»ç¦ã æä¸ä¸ªæ¹æ³å¯ä»¥è§£å³è¿ä¸ªé®é¢ãbc å½ä»¤è½è¯å«è¾å ¥éå®åï¼å è®¸ä½ å°ä¸ä¸ªæä»¶éå®åå° bc å½ä»¤æ¥å¤çãä½è¿åæ ·ä¼å«äººå¤´ç¼ï¼å ä¸ºä½ è¿å¾å°è¡¨è¾¾å¼åæ¾å°æä»¶ä¸ã æå¥½çåæ³æ¯ä½¿ç¨å èè¾å ¥éå®åï¼å®å è®¸ä½ ç´æ¥å¨å½ä»¤è¡ä¸éå®åæ°æ®ï¼å¯ä»¥å°ææ bash 计ç®å¨æ¶åçé¨å齿¾å°åä¸ä¸ªèæ¬æä»¶çä¸åè¡ãä¸é¢æ¯å¨èæ¬ä¸ä½¿ç¨è¿ç§ææ¯çä¾åã ```bash $ cat test12 #!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=$(bc << EOF scale = 4 a1 = ($var1 * $var2) b1 = ($var3 * $var4) a1 + b1 EOF ) echo The final answer for this mess is $var5 ``` å°é项åè¡¨è¾¾å¼æ¾å¨èæ¬çä¸åè¡ä¸å¯ä»¥è®©å¤çè¿ç¨å徿´æ¸ æ°ï¼æé«æè¯»æ§ãEOF å符串æ è¯äºéå®åç» bc å½ä»¤çæ°æ®çèµ·æ¢ãå½ç¶ï¼å¿ é¡»ç¨å½ä»¤æ¿æ¢ç¬¦å·æ è¯åºç¨æ¥ç»åéèµå¼çå½ä»¤ã ä½ è¿ä¼æ³¨æå°ï¼å¨è¿ä¸ªä¾åä¸ï¼ä½ å¯ä»¥å¨ bash 计ç®å¨ä¸èµå¼ç»åéãæä¸ç¹å¾éè¦ï¼å¨ bash 计ç®å¨ä¸å建çåéåªå¨ bash 计ç®å¨ä¸ææï¼ä¸è½å¨ shell èæ¬ä¸ä½¿ç¨ã ## éåºèæ¬ è¿ä»ä¸ºæ¢ææç示ä¾èæ¬ä¸ï¼æä»¬é½æ¯ç´æ¥åæ¢çãè¿è¡å®æå䏿¡å½ä»¤æ¶ï¼èæ¬å°±ç»æäºãå ¶å®è¿æå¦å¤ä¸ç§æ´ä¼é çæ¹æ³å¯ä»¥ä¸ºèæ¬åä¸ä¸ä¸ªå¥å·ã shell ä¸è¿è¡çæ¯ä¸ªå½ä»¤é½ä½¿ç¨`éåºç¶æç `ï¼exit statusï¼åè¯ shell å®å·²ç»è¿è¡å®æ¯ãéåºç¶æç æ¯ä¸ä¸ª 0 ï½ 255 çæ´æ°å¼ï¼å¨å½ä»¤ç»æè¿è¡æ¶ç±å½ä»¤ä¼ ç» shellãå¯ä»¥æè·è¿ä¸ªå¼å¹¶å¨èæ¬ä¸ä½¿ç¨ã ### æ¥çéåºç¶æç Linux æä¾äºä¸ä¸ªä¸é¨çåé`$?`æ¥ä¿åä¸ä¸ªå·²æ§è¡å½ä»¤çéåºç¶æç ã对äºéè¦è¿è¡æ£æ¥çå½ä»¤ï¼å¿ é¡»å¨å ¶è¿è¡å®æ¯åç«å»æ¥çæä½¿ç¨$?åéãå®çå¼ä¼åæç± shell ææ§è¡çæå䏿¡å½ä»¤çéåºç¶æç ã ```bash $ date Sun Dec 20 01:35:39 PM CST 2020 $ echo $? 0 $ ``` æç §æ¯ä¾ï¼ä¸ä¸ªæåç»æçå½ä»¤çéåºç¶æç æ¯ 0ã妿ä¸ä¸ªå½ä»¤ç»ææ¶æé误ï¼éåºç¶æç å°±æ¯ä¸ä¸ªæ£æ°å¼ã ```bash $ asdfg -bash: asdfg: command not found $ echo $? 127 ``` æ æå½ä»¤ä¼è¿åä¸ä¸ªéåºç¶æç 127ãLinux é误éåºç¶æç 没æä»ä¹æ åå¯å¾ªï¼ä½æä¸äºå¯ç¨çåèã - 0 å½ä»¤æåç»æ - 1 ä¸è¬æ§æªç¥é误 - 2 ä¸éåç shell å½ä»¤ - 126 å½ä»¤ä¸å¯æ§è¡ - 127 没æ¾å°å½ä»¤ - 128 æ æçéåºåæ° - 128+x ä¸ Linux ä¿¡å· x ç¸å ³ç严éé误 - 130 éè¿ Ctrl+C ç»æ¢çå½ä»¤ - 225 æ£å¸¸èå´ä¹å¤çéåºç¶æç éåºç¶æç 126 表æç¨æ·æ²¡ææ§è¡å½ä»¤çæ£ç¡®æéã ```bash $ ./myprog.c -bash: ./myprog.c: Permission denied $ echo $? 126 $ ``` å¦ä¸ä¸ªä¼ç¢°å°ç常è§é误æ¯ç»æä¸ªå½ä»¤æä¾äºæ æåæ°ã ```bash $ date %t date: invalid date '%t' $ echo $? 1 $ ``` è¿ä¼äº§çä¸è¬æ§çéåºç¶æç 1ï¼è¡¨æå¨å½ä»¤ä¸åçäºæªç¥é误ã ### exit å½ä»¤ é»è®¤æ åµä¸ï¼shell èæ¬ä¼ä»¥èæ¬ä¸çæåä¸ä¸ªå½ä»¤çéåºç¶æç éåºãä½ å¯ä»¥æ¹åè¿ç§é»è®¤è¡ä¸ºï¼è¿åèªå·±çéåºç¶æç ãexit å½ä»¤å è®¸ä½ å¨èæ¬ç»ææ¶æå®ä¸ä¸ªéåºç¶æç ã ```bash $ cat test13 #!/bin/bash # testing the exit status var1=10 var2=30 var3=$[$var1 + $var2] echo The answer is $var3 exit 5 $ ``` 彿¥çèæ¬çéåºç æ¶ï¼ä½ ä¼å¾å°ä½ä¸ºåæ°ä¼ ç» exit å½ä»¤çå¼ã ```bash $ chmod u+x test13 $ ./test13 The answer is 40 $ echo $? 5 $ ``` ä¹å¯ä»¥å¨ exit å½ä»¤çåæ°ä¸ä½¿ç¨åéã ```bash $ cat test14 #!/bin/bash # testing the exit status var1=10 var2=30 var3=$[$var1 + $var2] exit $var3 $ ``` å½ä½ è¿è¡è¿ä¸ªå½ä»¤æ¶ï¼å®ä¼äº§çå¦ä¸éåºç¶æã ```bash $ chmod u+x test14 $ ./test14 $ echo $? 40 $ ``` å¨ä»¥å¾ï¼exit éåºç¶æç æå¤§åªè½æ¯ 255ï¼å¦æè¶ è¿äº 255ï¼æç»çç»ææ¯æå®çæ°å¼é¤ä»¥ 256 åå¾å°ç使°ãæ¯å¦ï¼æå®ç弿¯ 300ï¼è¿åå¼ï¼ï¼ä½æ°æ¯ 44ï¼å æ¤è¿ä¸ªä½æ°å°±æäºæåçç¶æéåºç ã使¯å¨ç°å¨ï¼æ¤éå¶å·²ç»ä¸åå¨ï¼ä½ å¯ä»¥ä½¿ç¨ exit æä»¤æå®æ´å¤§çæ°å¼ã å°ç®å为æ¢ï¼èæ¬ä¸çå½ä»¤é½æ¯æç §æåºçæ¹å¼ä¸ä¸ªæ¥çä¸ä¸ªå¤ççãå¨ä¸ç« ä¸ï¼ä½ å°å¦ä¹ å¦ä½ç¨ä¸äºé»è¾æµç¨æ§å¶æ¥æ´æ¹å½ä»¤çæ§è¡æ¬¡åºï¼ä¹ä¼äºè§£å°å¦ä½ç¨ if-then è¯å¥æ¥æ£æ¥æä¸ªå½ä»¤è¿åçéè¯¯ç¶æï¼ä»¥ä¾¿ç¥éå½ä»¤æ¯å¦æåã