Shell 十三問 的學習記錄

2022-08-20 19:42:10 字數 3543 閱讀 8574

在 bbs上看到了shell十三問的帖子,由於比較就遠了,怕以後再也找不到了,就把筆記貼過來了,

shell 十三問

貼出我做的筆記:

《一》、為何叫做shell

使用者通過shell(作業系統即核心kernel的外殼)與kernel溝通,這是shell與kernel的命名的關係。

從技術角度講,shell的最簡單定義是——命令解譯器( command interpreter )

/etc/shells 中存放著系統預裝的好幾種shell

大部分的linux 系統的預設 shell 都是 bash,原因:

*自由軟體

*功能強大

《二》、shell prompt(ps1) 與 carriage return(cr)的關係?

$: 給一般使用者賬號使用

#: 給 root(管理員)賬號使用

shell prompt 的意思很簡單:

carriage return 的意思也很簡單:

不同的命令可接受的命令列格式或有不同,一般情況下,乙個標準的命令列格式為:

若從技術細節來看,shell 會根據 ifs(internal field seperator)將 command line 所輸入的文字給拆解為「字段」

然後再針對特殊字元(meta)先作處理,最後在重組整行 command line. (注意:請務必理解上面兩句話的意思,我們日後 的 學習中會經常回到這裡思考。)

每乙個命令列均必須含有命令名稱,這是不能缺少的。

《三》、 別人 echo、你也 echo, 是問 echo 知多少?

承接上面所介紹的 command line, 這裡我們用 echo 這個命令加以進一步說明,標準的 command line 飽含三個部件:command_name option argument

echo -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.

《八》、 $(()) 與 $() 還有 ${} 差在哪?

$() 與 ``(反引號)都用來做命令替換用的。

所謂的命令替換與我們學過的變數替換差不多,都是用來重組命令列:完成引號裡的命令列,然後將其結果替換出來,再重組命令列。

《九》、$@ 與 $* 差在哪?

$@ 與 $* 在一般時都可以獲得函式的所有引數

但是,當 $@ 與 $* 處在 hard quote即 ""中時,表現出的區別是:

$@  會將所有的引數挨個返回

$*  會將所有的引數拼成乙個字串返回

$#  可以返回引數的總數 (不包括 $0,即路徑)

$  通過${}可以獲得超過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

# elif [[ "$a" < 123 ]]; then

# else

# fi

case:

# case "$1" in

# esac

<13>、 for what? while 與 until 差在哪?

....

Shell 十三問整理

組成 literal meta 就是一些字母單詞,組成命令的 特殊保留字元,對於shell有特殊意義 重點meta有分command meta和shell meta 舉例awk 1.txt 這裡 會被解釋成shell meta。awk 1.txt 中的 被解釋成command meta 常見meta...

linux學習(十三)shell

宣告及感謝,本文為參照朱有鵬的linux課程總結的,在此對朱有鵬老師表示感謝.shell 是一類變成語言 shell 語言有很多種,linux下常用的指令碼語言其實就是bash,sh shell 程式執行的方式有三種 第一種 xx.sh 這種是需要可執行許可權的,可以使用 chmod a x xx....

SHELL十三問之七 與 差在哪?

先說一下,為何要用 或 好了。qw8l8 m 1 許多時候,我們在 shell 操作上,需要在一定條件下一次執行多個命令,也就是說,要麼不執行,要麼就全執行,而不是每次依序的判斷是否要執行下乙個命令。或是,需要從一些命令執行優先次順中得到豁免,如算術的 2 3 4 那樣.這時候,我們就可引入 命令群...