12.3 Shell指令碼中的選項分析
第一種方式,使用case語句手工處理選項。
第二種方式,使用getopts命令分析選項
文法格式:
getopts option-string variable
option-string是包含所有單字元選項的字串,這些字元就是getopts要進行分析的。
這些選項應該被賦予一個變數,變數variable就是被賦值變數的變數名。
getopts對命令列所給出的選項進行分析,分析過程為:
1)getopts選項檢查所有命令列參數,找到以"-"字元開頭的字元。
2)當找到以"-"字元開頭的參數後,將跟在"-"字元後的字元與在option-string中的給出的字元進行比
較。
3)若找到匹配,指定的變數variable被設定成選項,否則variable被設定成"?"字元。
4)重複1-3直到遍曆完搜尋選項
5)當分析完後,getopts返回非零值並推出。
getopts的另一個特徵是它可以指出需要額外參數的選項。在option-string中的選項後加上一個":"
字元就可以實現這一功能。在這種情況下,選項被分析後,額外的參數被設定成變數OPTARG的值。
使用getopts
while f:o:v OPTION:
do
case "$OPTION" in
f) F=$OPTION ;;
o) O=$OPTION ;;
v) V=$OPTION ;;
*) echo "$USAGE" ;
exit 1
;;
esac
done
第12學時 輸入/輸出
當命令產生寫向終端的輸出時,就稱程式將它的輸出列印到標準輸出(STDOUT)。
出錯資訊並不寫向STDOUT,它們寫向一個特殊的類型輸出上,該輸出稱為標準錯誤輸出(STDERR),
它是為出錯資訊保留的。
13.1.1 向終端輸出
1)echo
2)printf
13.1.2 輸出重新導向
在Shell指令碼中,常常需要俘獲命令的輸出並將其存入檔案。當輸出儲存在檔案中時,可以很方便地對其
進行編輯和修改。
重新導向操作符 ">","<"
">"符號重新導向會覆蓋原有檔案裡的資料,使用時需要注意。
如果需要在原有基礎上增加資料,可以使用">>"追加資料到檔案的尾部。
向檔案和螢幕重新導向輸出
在某些情況下,需要同時向檔案和終端重新導向指令碼的輸出。可使用tee命令。
例如:$ date | tee now
在終端上輸出當前日期,並將資料寫入檔案nowzhong。
13.2 輸入
1)將輸入重新導向到檔案,從而從檔案中讀取輸入。
2)從使用者讀取輸入。
3)將一個命令的輸出重新導向到另一個命令的輸入。
13.2.1 輸入重新導向
command < file
13.2.2 讀取使用者輸入
Shell指令碼的常見任務之一就是提示使用者輸入,然後讀取使用者的響應。
格式:
read name
它讀取使用者輸入的一整行,直到使用者輸入斷行符號鍵為止,它使得該行成為由name所制定變數的值。
例如:
YN=yes
printf "Do you want to play a gane [$YN]?"
read YN
case $YN in
[yY]) echo yes ;;
*) echo "maybe later." ;;
esac
13.2.3 管道
UNIX中處理檔案的命令大多都能從STDIN中讀取輸入,這使得使用者可以使用一個程式過濾另一個程式的輸
出。
使用管道可以將一個命令的輸出重新導向到另一個命令的輸入。管道使用可以將幾個命令連在一起。
例如:$ who | grep sudo
將who命令的輸出作為下一個命令的輸入,再進行過濾輸出到終端。
13.3 檔案描述符
標準輸入(STDIN)0
標準輸出(STDOUT) 1
標準錯誤(STDERR) 2
command 1>file1 2>file2
給定command的STDOUT重新導向到file1,STDERR(錯誤資訊)重新導向到file2
for FILE in $FILES
do
ln -s $FILE ./docs >> /tmp/ln.log 2> /dev/null
這裡ln的STDOUT增加到檔案/tmp/ln.log中,STDOUT重新導向到檔案的/dev/null中
注意:檔案/dev/null是所有UNIX系統中都能使用的用於刪除輸出的一個reshuffle檔案。