進階shell指令碼編程之重新導向、環境變數、shell函數
shell並不局限於簡單地逐行執行命令,更為強大的功能之一是能夠建立函數和函數庫。希望自訂命令列互動的方式或者自動化檔案處理任務。考慮用shell指令碼。
1、輸入和輸出重新導向
STDIN
STDOUT
STDERR
重新導向操作符
>
-------把STDOUT重新導向到一個檔案
<
-------把STDIN重新導向到一個檔案
>>
-------把STDOUT添加到一個檔案的末尾
|
-------從一個程式或者進程擷取輸出,然後發送給另一個程式或進程
<<delimiter 把當前的輸入資料流和STDIN關聯起來直到到達指定的分隔字元。
[root@localhost shell]# cat << END
> the cat
> sat on the
> Mat.
> END
the cat
sat on the
Mat.
[root@localhost shell]# cat << END
> the cat
> sat on the
> Mat.
> END
the cat
sat on the
Mat.
>操作符有幾個修飾標記,這些標記可以改變他的行為。
>& STDOUT和STDERR同時進行重新導向。
>! 將迫使檔案以append模式建立,或者以normal模式覆蓋一個已經存在的檔案。
>@ 將以二進位模式開啟一個檔案
2、命令替換:反引號和圓括弧擴充
#!/bin/sh
Lines=`wc -l filelist`
echo $Lines
[root@localhost shell]# ./p206
28 filelist
Lines=$(wc -l filelist) //符號擴充
3、使用環境變數和shell變數
export命令用於修改shell變數,不帶選項會顯示很多環境變數。
export PATH=/bin
set命令可查看環境中已設定的shell變數
4、Shell函數
<1>、形式
name() {command;}
shell函數必須聲明之後才能使用。還可以有傳回值
#!/bin/sh
repeat(){
echo -en "I don't know $1 $2\n"
echo -en "hello\n"
return 0
}
repeat Your Name
<2>、嵌套函數和遞迴
#!/bin/sh
number_one(){
echo "this is first one func speaking..."
number_two
}
number_two(){
echo "this is second func speaking...."
}
number_one
<3>、範圍
範圍包括全域域和局部域:使用local關鍵字標識局部變數
#!/bin/sh
scope(){
local soc=1
gblsoc=2
echo "local soc in func = $soc"
echo "global gblsoc in func = $gblsoc"
}
scope
echo "local soc outside func = $soc"
echo "gblsoc outside in func =$gblsoc"
exit 0
補充:echo命令用法:
echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用。
該命令的一般格式為: echo [ -n ] 字串
其中選項n表示輸出文字後不換行;字串能加引號,也能不加引號。用echo命令輸出加引號的字串時,將字串原樣輸出;用echo命令輸出不加引號的字串時,將字串中的各個單詞作為字串輸出,各字串之間用一個空格分割。
功能說明:顯示文字。
語 法:echo [-ne][字串]或 echo [--help][--version]
補充說明:echo會將輸入的字串送往標準輸出。輸出的字串間以空白字元隔開, 並在最後加上換行號。
參 數:-n 不要在最後自動換行
-e 若字串中出現以下字元,則特別加以處理,而不會將它當成一般
文字輸出:
\a 發出警告聲;
\b 刪除前一個字元;
\c 最後不加上分行符號號;
\f 換行但游標仍舊停留在原來的位置;
\n 換行且游標移至行首;
\r 游標移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\\ 插入\字元;
\nnn 插入nnn(八進位)所代表的ASCII字元;
–help 顯示協助
–version 顯示版本資訊