shell傳遞引數 單雙引號區別

2022-03-10 01:47:32 字數 4152 閱讀 6989

shell傳遞引數

$0 對應的是當前 shell 指令碼程式的名稱,$#對應的是總共有幾個引數,$*對應的是所有位置的引數值,$?對應的是顯示上一次命令的執行返回值,而$1、$2、$3……則分別對應著第 n 個位置的引數值,如圖 所示。

舉例子說明:

在上面例子中,echo內容在" "(雙引號)中,如果 '  '(單引號)中。看下執行結果

其中,被賦值的變數按照指令碼內容一模一樣列印出來了。對比單引號和雙引號可參考博文:linux shell中的單引號與雙引號的區別(看完就不會有引號的疑問了)

shell prompt敲打鍵盤、直到按下enter的時候,輸入的字元就是command line(命令列)了,然後shell才會以程序方式執行你所提交的命令。

在command line輸入的每乙個文字,對shell來說,有什麼類別之分呢?command line的每乙個charactor(字元)分為兩種:1.*literal(字面意義)2.*meta(元)

① *literal:也就是普通純文字,對shell來說沒有特殊功能。

② *meta:對shell來說,具有特定功能的保留字。

凡是 abcd、123456 等這些「文字」都是literal。幾乎每次都會碰到的meta組成如下:

*ifs:由三者之一組成(我們常用space)。

*cr:由產生。

ifs是用來拆分command line的每乙個詞(word)用的,因為shell command line是按詞來處理的。而cr則是用來結束command line用的,這也是為何我們敲命令就會執行的原因。除了ifs和cr外,常用的meta還有:

= :  設定變數。

$ :  做變數或運算替換(請不要與 shell prompt 搞混了)。

> :  重定向 stdout。

< :  重定向 stdin。

|:   管道命令。

& :  重定向 file descriptor ,或將命令置於後台執行。

( ): 將其內的命令置於 nested subshell 執行,或用於運算或命令替換。

: 將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍。

; :  在前乙個命令結束時,而忽略其返回值,繼續執行下乙個命令。

&& : 在前乙個命令結束時,若返回值為 true,繼續執行下乙個命令。

|| : 在前乙個命令結束時,若返回值為 false,繼續執行下乙個命令。

!:   執行 history 列表中的命令

假如我們要在command line中將這些保留元字元的功能關閉的話,就要用到 quoting 處理了。

在bash中,我們常用的 quoting有如下三種方法:

*hard quote:' '(單引號):凡在hard quote中的所有meta均被關閉。

*soft quote:" "(雙引號):在soft quote中的大部分meta都會被關閉,但某些保留(如$)。

*escape:\ (反斜線):只有緊接在escape(跳脫字元)之後的單一meta才被關閉。

下面的例子將有助於我們對 quoting 的了解:

$ a=b c        # 空白鍵未被關閉,作為ifs 處理。

$ c: command not found. 

$ echo $a

$ a="b c"        # 空白鍵已被關閉,僅作空白符號處理。

$ echo $a

b c在第一次設定 a 變數時,由於空白鍵沒有被關閉,command line 將被解讀為:

* a=b 然後碰到,再執行 c 命令

在第二次設定 a 變數時,由於空白鍵置於 soft quote 中,因此被關閉,不再作為 ifs :

* a=bc

事實上,空白鍵無論在 soft quote 還是在 hard quote 中,均會被關閉。enter 鍵亦然:

$ a='b

> c

> '

$ echo "$a"bc

在上例中,由於 被置於 hard quote 當中,因此不再作為 cr 字元來處理。

這裡的 單純只是乙個斷行符號(new-line)而已,由於 command line 並沒得到 cr 字元,

因此進入第二個 shell prompt (ps2,以 > 符號表示),command line 並不會結束,

直到第三行,我們輸入的 並不在  hard quote 裡面,因此並沒被關閉,

此時,command line 碰到 cr 字元,於是結束、交給 shell 來處理。

上例的 要是被置於 soft quote 中的話, cr 也會同樣被關閉:

$ a="b

> c

> "

$ echo $a

b c然而,由於 echo $a 時的變數沒置於 soft quote 中,沒有得到cr字元;會被解釋為 ifs ,而不是解釋為 new line 字元。

總結:command line的每乙個charactor分兩種,分別是 *literal  *meta 。其中literal指的是普通純文字,例如 abcd、123456 等這些「文字」都是literal。

而meta對於shell來說,具有特定功能的保留字,我們經常碰到的meta分為 ifs cr;區別如下

*ifs:由三者之一組成(我們常用space)。  作用:ifs是用來拆分command line的每乙個詞(word)用的

*cr:由產生。  作用:cr結束command line用的,這也是為何我們敲命令就會執行的原因。

除了ifs,cr。常用的meta還有:

= :  設定變數。

$ :  做變數或運算替換(請不要與 shell prompt 搞混了)。

> :  重定向 stdout。

< :  重定向 stdin。

|:   管道命令。

& :  重定向 file descriptor ,或將命令置於後台執行。

( ): 將其內的命令置於 nested subshell 執行,或用於運算或命令替換。

: 將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍。

; :  在前乙個命令結束時,而忽略其返回值,繼續執行下乙個命令。

&& : 在前乙個命令結束時,若返回值為 true,繼續執行下乙個命令。

|| : 在前乙個命令結束時,若返回值為 false,繼續執行下乙個命令。

!:   執行 history 列表中的命令

1、單引號、雙引號用於使用者把帶有空格的字串賦值給變數的分界符。

[root@localhost sh]# str="today is monday"

[root@localhost sh]# echo $str

today is monday

如果沒有單引號或雙引號,shell會把空格後的字串解釋為命令。

[root@localhost sh]# str=today is monday

bash: is: command not found

2、單引號和雙引號的區別。單引號告訴shell忽略所有特殊字元,而雙引號忽略大多數,但不包括   $     \     `

雙引號中的'$'(引數替換)和'`'(命令替換)是例外,所以,兩者基本上沒有什麼區別,除非在內容中遇到了引數替換符$和命令替換符`。

如:num=3

echo 『$num』   

$num

echo 「$num」

3

shell 中單雙引號和反引號的區別

以單引號 包圍變數的值時,單引號裡面是什麼就輸出什麼,即使內容中有變數和命令 命令需要反引起來 也會把它們原樣輸出。這種方式比較適合定義顯示純字串的情況,即不希望解析變數 命令等的場景。以雙引號 包圍變數的值時,輸出時會先解析裡面的變數和命令,而不是把雙引號中的變數名和命令原樣輸出。這種方式比較適合...

C 單雙引號區別

贏家只關注怎麼贏,輸家只關注贏家在幹嘛 自己從 python 轉 c 乙個很嚴重的問題是搞不清引號怎麼用。在 python 中,單雙引號無所謂,隨便用,只要別混用就好。但是 c 明顯不同,剛好今天做 leetcode 時結結實實踩了乙個坑,所以記錄在這邊。今天遇到的問題是類似這樣的 string s...

Shell學習之單雙引號

和c語言同,shell 指令碼中的單引號和雙引號一樣都是字串的界定符 雙引號下一節介紹 而不是字元的界定符。單引號用於保持引號內所有字元的字面值,即使引號內的 和回車也不例外,但是字串中不能出現單引號。如果引號沒有配對就輸入回車,shell 會給出續行提示符,要求使用者把引號配上對。例如 itcas...