標籤: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 十三問 的學習記錄