shell程式設計基礎(3.常用概念命令與操作
5訊號處理
訊號就是系統向指令碼或命令發出的訊息,告知它們某個事件的發生。這些事件通常是記憶體錯誤,訪問許可權問題或某個使用者試圖停止你的程序。訊號實際上是一些數字。下表列出了最常用的訊號及它們的含義列出所有訊號:
>kill –l
HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1
USR2 CLD PWR VTALRM PROF IO WINCH STOP TSTP CONT TTIN TTOU
一些訊號的含義:
1 SIGHUP 掛起或父程序被殺死
2 SIGINT 來自鍵盤的中斷訊號,通常是< C T R L - C >
3 SIGQUIT 從鍵盤退出
9 SIGKILL 無條件終止
11 SIGSEGV 段(記憶體)衝突
15 SIGTERM 軟體終止(預設殺程序訊號)
5.1 發出訊號:
kill –訊號 程序號
註明:kill –9 程序號 殺死程序時,作業系統直接將程序從核心清除,不作退出的處理
5.2 檢測訊號或者捕捉訊號
有些訊號可以被應用程式或指令碼捕獲,並依據該訊號採取相應的行動。另外一些訊號不
能被捕獲。例如,如果一個命令收到了訊號9,就無法再捕捉其他訊號。
當指令碼捕捉到一個訊號後,它可能會採取下面三種操作之一:
1) 不採取任何行動,由系統來進行處理。
2) 捕獲該訊號,但忽略它。
3) 捕獲該訊號,並採取相應的行動
如果需要捕捉訊號後,採用自定義的操作,可以使用trap命令:
trap name signal(s)
其中,name是捕捉到訊號以後所採取的一系列操作。實際生活中, name一般是一個專門用來處理所捕捉訊號的函式。Name需要用雙引號(“ ”)引起來。Signal就是待捕捉的訊號。
下表列出了一些最常見的trap命令用法:
trap "" 2 3 忽略訊號2和訊號3,使用者不能終止該指令碼
trap"commands" 2 3 如果捕捉到訊號2或3,就執行相應的commands命令
trap 2 3 復位訊號2和3,使用者可以終止該指令碼
如:收到3( SIGQUIT 從鍵盤退出),列印一行“proc received SIGQUIT and exit”
#!/bin/ksh
trap “fun_exit” 3
fun_exit()
{
echo “proc received SIGQUIT and exit”
exit 1
}
echo “start running”
exit 0
6 eval命令
eval命名可以執行之後跟隨的命令或者變數所賦的值或者表示式。比如:
用法1:
eval echo “aaa”
用法2:
command=env
eval $env
command=”echo aaa”
eval $command
用法3:
value=0
eval [ $? -gt $value ]&&j=1
eval [ $? -gt $value ]&& echo “successfully”
eval var=$#
eval命令在執行程式執行過程中賦值命令的變數非常有用。比如在SHELL編制的人機互動介面中,選中某個選單項後執行沒個命令或者函式,指令碼本身不可能為每個選單項case一遍。
【4】其他
4.1 使用不同的殼執行命令檔案
1) 如果Script的第一個非空白字元不是"#",則它會使用Bourne Shell。
2) 如果Script的第一個非空白字元是"#"時,但不以"#!"開頭時,則它會使用C Shell。
3)如果Script以"#!"開頭,則"#!"後面所寫的就是所使用的Shell,而且要將整個路徑名稱指出來,這裡建議使用第三種方式指定Shell ,以確保所執行的就是所要的。Bourne Shell的路徑名稱為/bin/sh ,而C Shell 則為/bin/csh。我們一般使用ksh, 路徑為/bin/ksh
4.2 使用不同SHELL的區別
BSH:
設定環境變數使用export var=var_value; var=var_valu; export var
CSH/KSH:
設定環境變數使用setenv var var_value
一些KSH獨有的特徵:
1)KSH環境變數
HISTSIZE:歷史命令數量,預設為128,可以在.chsrc中將其設定為其他值
TMOUT :超時自動退出,用於一段時間沒有鍵入命令,強制退出
1) 別名
可以定義自己的標識,標識定義的命令。比如:
alias dba dbaccess $TELLIN_DBNAME
2) 支援陣列變數
4.3 SHELL程式的返回值不能超出255,否則返回值將不確定
4.4 read命令將輸入的多餘的part給最後一個變數
>read var1 var2
aa bb cc
>echo $var1
aa
>echo $var2
bb cc
4.5 除錯
使用-x
1) 在SHELL程式指定執行為除錯模式
#!/bin/sh –x
2) 在命令列中指定除錯模式執行
指定SHELL –x 程式名稱,如:
sh –x update_iuser214.sh
4.6 執行SHELL
前臺執行:
>sh 程式名稱
>程式名稱
後臺執行:
>sh 程式名稱 &
>程式名稱 &
4.7 移植性
目前智慧業務部的裝置選型中,小型機從IBM/HP/SUN 3家中選擇。相應我們的SHELL一般需要在AIX,HP-UX,SunOS上應當保持一致。即SHELL程式一般需要在3中作業系統上進行移植。
可以使用uname –s確定機器的作業系統,比如:
#機器型別
OsType=`uname -s`
if [ "-$OsType" = "-SunOS" ]; then
…
elif [ "-$OsType" = "-HP-UX" ]; then
…
elif [ "-$OsType" = "-AIX" ]; then
…
else
echo "ERROR: system not support this machine type $OsType"
eixt 1
fi
大部分常見的UNIX命令在以上3中操作是一致的,但是某些命令則具有差異(如ftp的ls在HP-UX為nlist)。如果碰到與作業系統相關的地方,則需要根據作業系統作相應處理。
附錄:
一個SHELL編制的人機互動介面,裡面使用的SHELL語法比較深入。如果能讀懂或者編制同樣程式,則表明你的SHELL教本功底已經足夠深厚。如果不能讀懂,可以挑戰一下自己。