1. 程式人生 > >shell程式設計基礎(3.常用概念命令與操作

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教本功底已經足夠深厚。如果不能讀懂,可以挑戰一下自己。