Shell 十三問 的學習記錄

來源:互聯網
上載者:User

標籤:des   http   io   ar   使用   sp   for   on   檔案   

在 BBS上看到了Shell十三問的文章,由於比較就遠了,怕以後再也找不到了,就把筆記貼過來了,

原帖地址:

shell 十三問
http://bbs.chinaunix.net/thread-2033675-1-1.html

 

貼出我做的筆記:

<一>、為何叫做shell使用者通過shell(作業系統即核心kernel的外殼)與kernel溝通,這是shell與kernel的命名的關係。從技術角度講,shell的最簡單定義是——命令解譯器( Command Interpreter )/etc/shells 中存放著系統預裝的好幾種shell大部分的linux 系統的預設 shell 都是 bash,原因:*自由軟體*功能強大 <二>、shell prompt(PS1) 與 Carriage Return(CR)的關係?$: 給一般使用者帳號使用#: 給 root(管理員)帳號使用shell prompt 的意思很簡單: 是 shell 告訴使用者:您現在可以輸入命令列了,使用者只有在得到 shell prompt 才能開啟命令列,而 cursor(游標) 是指示鍵盤 在命令列所輸入的位置,使用者每輸入一個鍵,cursor 便往後移動一格,直到碰到命令列讀進Carriage Return 字元為止。Carriage Return 的意思也很簡單: 是使用者告訴 shell:老兄你可以執行我的命令列了。 不同的命令可接受的命令列格式或有不同,一般情況下,一個標準的命令列格式為: command-name options argument若從技術細節來看,shell 會根據 IFS(Internal Field Seperator)將 command line 所輸入的文字給拆解為“欄位”然後再針對特殊字元(meta)先作處理,最後在重組整行 command line. (注意:請務必理解上面兩句話的意思,我們日後 的 學習中會經常回到這裡思考。)每一個命令列均必須含有命令名稱,這是不能缺少的。<三>、 別人 echo、你也 echo, 是問 echo 知多少?承接上面所介紹的 command line, 這裡我們用 echo 這個命令加以進一步說明,標準的 command line 飽含三個組件:command_name option argumentecho -e "a\t"       -e選項是開啟反斜線控制字元 <四>、 ""(雙引號)與‘‘(單引號)差在哪?hard quote: ‘‘ 單引號,凡在hard quote 中的所有系統保留關鍵字meta 均被關閉。soft quote: "" 雙引號,在soft quote中大部分的meta 都會被關閉,蛋某些則被保留(如 $)escape: \ 反斜線,只有進階在 escape(跳脫字元)之後的單一 meta才被關閉。 <五>、 var=value? export 前後差在哪?所謂的環境變數就是那些會傳遞給子行程的變數遺傳性 是區分本地變數與環境變數的決定性指標var=value 賦值只是給局部變數賦值export var=value 則是給環境變數賦值unset var   對var變數取消,與對其賦值為NULL 是不一樣的  <六>、exec 跟 source 差在哪?瞭解 父進程(parent process) 和子進程(child process)的區別,父進程產生子進程,子進程結束後將返回到父進程去,子進程繼承父進程的環境變數。命令指令碼(shell script):就是將平時在 shell prompt 後所輸入的多行 command line 依序寫入一個檔案中去而已。其中再加上一些條件判斷、互動介面、參數運用、函數調用、等等技巧,得以讓 script 更加聰明的執行、。 結合上面兩個概念(process + script),便不難理解下面這句話的意思了正常來說,當我們執行一個 shell script 時,其實是先產生一個 sub-shell 的子進程,然後sub-shell 再去產生命令列的子進程。一般我們跑的 shell script 是用 sub-shell去執行的。當用 subshell 來跑 script 的話嗎sub shell 的workding dir($PWD) 會因為 cd 而變更,但當返回 primary shell 時,$PWD 是不會變更的。 source所謂 source 就是讓script 在當前 shell 內執行、而不是產生一個 sub-shell來執行。因此,只要我們將原本單獨輸入的script 命令列變成 source 命令的參數,就可以輕易解決上面提到的問題啦./my.sh可以變為source ./my.sh  或 ../my.script exec 也是讓 script 在同一個進程上執行,但是原有進程則被結束了。這就是 exec 與 source/fork 的最大差異了 <七>、 ()與 {} 差在哪?命令群組(command group):將多個命令集中處理。。()將 command group 置於 sub-shell來執行,也稱 nested sub-shell{} 則是在同一個 shell 內完成,也稱 non-named command group function 就是用一個名字去命名一個command group,然後再調用這個名字去執行 command group. <八>、 $(()) 與 $() 還有 ${} 差在哪?$() 與 ``(反引號)都用來做命令替換用的。所謂的命令替換與我們學過的變數替換差不多,都是用來重組命令列:完成引號裡的命令列,然後將其結果替換出來,再重組命令列。  <九>、[email protected] 與 $* 差在哪?[email protected] 與 $* 在一般時都可以獲得函數的所有參數但是,當 [email protected] 與 $* 處在 hard quote即 ""中時,表現出的區別是:[email protected]  會將所有的參數挨個返回$*  會將所有的參數拼成一個字串返回 $#  可以返回參數的總數 (不包括 $0,即路徑)${10}  通過${}可以獲得超過10的參數,否則會將$1拼接0返回 <10>、 && 與 || 差在哪?A=123[ "$A" = 100 ] 可以用來判斷A 是否等於100上面的格式會返回一個傳回值,若傳回值為 0則代表判斷正確,傳回值為 1代表判斷錯誤每個命令執行完之後均由一個傳回值,跟上面的含義相同[ "$A" = 100 ] && echo "yes,\$A is 100"    意思是 && 前面的傳回值為 ture時 執行後面[ "$A" = 100 ] || echo "no,\$A is not 100"  意思是 || 前面的傳回值為 false時 執行後面一行命令中可以有多個 &&  與 || 嵌套使用,如 [ "$A" = 100 ] || echo "no" && ls -G  && echo "yes"   <11>、 、、、、原文章被丟了。。。。。 <11.1>、stdin 與 stdout <11.2>、 stderr  及如何改變File Descriptor 的預設資料通道  <12>、 你要 if 還是 case 呢if:# if [[ "$A" = 123 ]]; then#  echo "oh,Yes"# elif [[ "$A" < 123 ]]; then#  echo "oh , \$A > 123"# else#  echo "what"# fi case: # case "$1" in#  start )#  echo "what is start";;#  stop )#  echo "hei,that is stop";;#  ok )#  echo "en , en A";;# esac  <13>、 for what? while 與 until 差在哪?....

Shell 十三問 的學習記錄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.