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> <tab> <enter>三者之一組成(我們常用space)。
*CR:由<enter>產生。
IFS是用來拆分command line的每一個詞(word)用的,因為shell command line是按詞來處理的。而CR則是用來結束command line用的,這也是為何我們敲<enter>命令就會執行的原因。除了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 然后碰到<IFS>,再執行 C 命令
在第二次設定 A 變量時,由於空白鍵置於 soft quote 中,因此被關閉,不再作為 IFS :
* A=B<space>C
事實上,空白鍵無論在 soft quote 還是在 hard quote 中,均會被關閉。Enter 鍵亦然:
$ A='B
> C
> '
$ echo "$A"
B
C
在上例中,由於 <enter> 被置於 hard quote 當中,因此不再作為 CR 字符來處理。
這里的 <enter> 單純只是一個斷行符號(new-line)而已,由於 command line 並沒得到 CR 字符,
因此進入第二個 shell prompt (PS2,以 > 符號表示),command line 並不會結束,
直到第三行,我們輸入的 <enter> 並不在 hard quote 里面,因此並沒被關閉,
此時,command line 碰到 CR 字符,於是結束、交給 shell 來處理。
上例的 <enter> 要是被置於 soft quote 中的話, CR 也會同樣被關閉:
$ A="B
> C
> "
$ echo $A
B C
然而,由於 echo $A 時的變量沒置於 soft quote 中,<enter> 沒有得到CR字符;會被解釋為 IFS ,而不是解釋為 New Line 字符。
總結:
command line的每一個charactor分兩種,分別是 *literal *meta 。其中literal指的是普通純文字,例如 abcd、123456 等這些“文字”都是literal。
而meta對於shell來說,具有特定功能的保留字,我們經常碰到的meta分為 IFS CR;區別如下
*IFS:由<space> <tab> <enter>三者之一組成(我們常用space)。 作用:IFS是用來拆分command line的每一個詞(word)用的
*CR:由<enter>產生。 作用:CR結束command line用的,這也是為何我們敲<enter>命令就會執行的原因。
除了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