shell十三問筆記

來源:互聯網
上載者:User
常見的 shell 主要分為兩大主流:
sh:
burne shell (sh)
burne again shell (bash)
csh:
c shell (csh)
tc shell (tcsh)
korn shell (ksh)
bash 是 gnu project 最成功的產品之一,自推出以來深受廣大 Unix
使用者喜愛,且也逐漸成為不少組織的系統標準。

echo 在預設上,在顯示完 argument 之後,還會送出一個分行符號號(new-line
charactor)。若你要取消這個分行符號號,可利用 echo 的 -n option ,舉例:
wangnc>echo "test "
test
wangnc>echo -n "test "
test wangnc>
wangnc>
事實上,echo 除了 -n options 之外,常用選項還有:
-e :啟用反斜線控制字元的轉換(參考下表)
-E :關閉反斜線控制字元的轉換(預設如此)
-n :取消行末之分行符號號(與 -e 選項下的 \c 字元同意)
關於 echo 命令所支援的反斜線控制字元如下表:
\a:ALERT / BELL (從系統喇叭送出鈴聲)
\b:BACKSPACE ,也就是向左刪除鍵
\c:取消行末之分行符號號
\E:ESCAPE,跳脫鍵
\f:FORMFEED,換頁字元
\n:NEWLINE,換行字元
\r:RETURN,斷行符號鍵
\t:TAB,表格跳位鍵
\v:VERTICAL TAB,垂直表格跳位鍵
\n:ASCII 八進位編碼(以 x 開首為十六進位)
\\:反斜線本身
舉例:
wangnc>echo "a\tb\tc\nd\te\tf"
a\tb\tc\nd\te\tf
wangnc>echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
wangnc>

除了 IFS 與 CR ,常用的 meta 還有:
= : 設定變數。
$ : 作變數或運算替換(請不要與 shell prompt 搞混了)。
> :重導向 stdout。
< :重導向 stdin。
|:命令管線。
& :重導向 file descriptor ,或將命令置於背境執行。
( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
{ }:將其內的命令置於 non-named function 中執行,或用在變數替換的界定範圍。
; :在前一個命令結束時,而忽略其傳回值,繼續執行下一個命令。
&& :在前一個命令結束時,若傳回值為 true,繼續執行下一個命令。
|| :在前一個命令結束時,若傳回值為 false,繼續執行下一個命令。
!:執行 history 列表中的命令
....

在 bash 中,常用的 quoting 有如下三種方法:
* hard quote:' ' (單引號),凡在 hard quote 中的所有 meta 均被關閉。
* soft quote: " " (雙引號),在 soft quoe 中大部份 meta
都會被關閉,但某些則保留(如 $ )。(注二)
* escape : \ (反斜線),只有緊接在 escape (跳脫字元)之後的單一
meta才被關閉。
舉例:
wangnc>A=b c
-bash: c: command not found
wangnc>A=b\ c
wangnc>echo $A
b c
wangnc>echo "$A"
b c
wangnc>echo '$A'
$A
wangnc>echo "'$A'"
'b c'
wangnc>echo '"$A"'
"$A"
wangnc>

在 bash 中,你可以用 "=" 來設定或重新定義變數的內容:
name=value
在設定變數的時侯,得遵守如下規則:
* 等號左右兩邊不能使用區隔符號(IFS),也應避免使用 shell 的保留字元(meta
charactor)。
* 變數名稱不能使用 $ 符號。
* 變數名稱的第一個字母不能是數字(number)。
* 變數名稱長度不可超過 256 個字母。
* 變數名稱及變數值之大小寫是有區別的(case sensitive)。

可利用命令列的變數替換能力來"擴充"(append)變數值,我們使用區隔符號( :
)來達到擴充目的,使用 {} 將變數名稱的範圍給明確定義出來:
wangnc>A=B:C:D
wangnc>echo $A
B:C:D
wangnc>A=$A:E
wangnc>echo $A
B:C:D:E
wangnc>A=BCD
wangnc>ech $A
-bash: ech: command not found
wangnc>echo $A
BCD
wangnc>A=$AE
-bash: AE: unbound variable
wangnc>A=${A}E
wangnc>echo $A
BCDE
wangnc>

嚴格來說,我們在當前 shell 中所定義的變數,均屬於"本地變數"(local
variable),只有經過 export 命令的"輸出"處理,才能成為環境變數(environment
variable),在使用 export 的時侯,請別忘記 shell
在命令列對變數的"替換"(substitution)處理,比方說:
wangnc>A=B
wangnc>B=C
wangnc>export $A
上面的命令並未將 A 輸出為環境變數,而是將 B
作輸出,這是因為在這個命令列中,$A 會首先被提換出 B 然後再"塞回"作 export
的參數。

()和{}的區別:
( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。
{ } 則是在同一個 shell 內完成,也稱為 non-named command group。
有點類似fork和source的區別

$@與$*差在哪?
若在 command line 上跑 my.sh p1 "p2 p3" p4 的話,不管是 $@ 還是 $*
,都可得到 p1 p2 p3 p4 就是了。但是,如果置於 soft quote 中的話:
"$@" 則可得到 "p1" "p2 p3" "p4" 這三個不同的詞段(word)﹔
"$*" 則可得到 "p1 p2 p3 p4" 這一整串單一的詞段。

相關文章

聯繫我們

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