shell指令碼寫host類型executable

來源:互聯網
上載者:User

最近在做一個的項目,因為有些功能使用ORACLE的package實現起來有點問題,但是用UNIX的指令碼實現起來卻很好,所以最終在AP上掛了一個executable為HOST類型的REQUEST,來解決這個問題。

因為覺得這個東西有點意思,所以把我瞭解到的一些很基本的東西share出來。

首先,必須有一個UNIX下面可以執行的shell script檔案,而且這個檔案必須放在相應Application的bin目錄下,例如,如果要將該request掛在GL下面,相應的目錄就是

$GL_TOP/$APPLBIN/

而且,要確保REQUEST執行者對這個檔案的execute許可權,例如在開發環境,如果將該檔案放在DEV2下,則DEV2AP這個使用者需要對該檔案有execute許可權。

而掛request的過程與掛普通request過程一樣。

重點在這個shell script,注意這個檔案一定要符合UNIX shell script的格式,另外推薦在UNIX環境下編寫script,因為windows下面的分行符號與UNIX下面不同。

傳參,指令碼讀取request的參數是通過 “$1”這種方式來讀取參數的。關於傳參,USER GUIDE上面有說$1-$4是內定的一些系統參數,使用者自訂的參數需要從$5開始。但是我實際在DEV2以及DEV4下面測試,卻發現,不是這樣的。

HOST類型executable在傳參的時候,將所有的參數都放在一個字串裡面傳給參數1,系統參數在前,自訂參數在後,而且無論設定參數類型為什麼,系統總是會在參數值兩邊加上雙引號,並且以空格來間隔各參數。

例如,我輸入3個字串參數,分別為

“test1”, “test2”, “test3”

那麼從$1將得到一個字串:

XXGLCONVERTFILE FCP_REQID=2303143 FCP_LOGIN="<USERID>/<PWD>"

FCP_USERID=1047 FCP_USERNAME="<USERNAME>" FCP_PRINTER="noprint"

FCP_SAVE_OUT=Y FCP_NUM_COPIES=0 "test1" "test2" "test3"

可以看到,系統參數除了第一個是SHELL指令碼名稱以外,其他的都是一系列的參數(NAME=VALUE)對,而且最後一個一般都是FCP_NUM_COPIES,並且值是一個數字,然後才是我們自訂的參數。於是,我們可以根據這個字串的特點來讀取我們自己的參數。

UNIX下面有一個功能強大的編輯工具SED,我們可以利用這個命令來達到我們擷取參數值的目的。

關於SED命令的詳細使用,可以查閱相關資料。

首先,我們讀取$1截取掉系統參數,並將加在自訂參數兩邊的雙引號去掉。

args=`echo $1 | sed "s/^.*FCP_NUM_COPIES=[0-9]* *"//" | sed "s/"//g"`

注意“s”表示替換字元,源字元與目的字元使用“/”間隔包含:

sed "s/source/destination/"

這樣我們對上述字串處理之後,正下的字串就是:

test1 test2 test3

接下來,我們可以繼續用sed命令截取各個參數值:

arg1=`echo $args|sed "s/ .*//"`

arg2=`echo $args|sed "s/$arg1 //"|sed "s/ .*//"`

arg3=`echo $args|sed "s/$arg1 $arg2 //"|sed "s/ .*//"`

在獲得各參數值後,我們就可以盡情的發揮我們的功力處理他們了,

args=`echo $1|sed "s/^.*FCP_NUM_COPIES=[0-9]* *"//"|sed "s/"//g"`

echo "args: "$args

arg1=`echo $args|sed "s/ .*//"`

echo "arg1: "$arg1

arg2=`echo $args|sed "s/$arg1 //"|sed "s/ .*//"`

echo "arg2: "$arg2

arg3=`echo $args|sed "s/$arg1 $arg2 //"|sed "s/ .*//"`

echo "arg3: "$arg3

如果輸入參數“test1”, “test2”, “test3”,以上程式的結果如下:

args: test1 test2 test3
arg1: test1
arg2: test2
arg3: test3

當然以上代碼只適用於比較簡單的情況,例如如果參數值中有空格或者斜杠就必須另外考慮了,不過sed命令相當強大,而且可以結合Regex使用,用它來處理一般都不會有問題。

如果要退出執行,可以直接用“exit”後面跟上一個數字表示結束代碼,如果不加,系統預設為0,表示成功,0以外的數字表示失敗(我沒有查到怎樣返回warning)。

 

http://wolfyuan.itpub.net/post/25778/280094

相關文章

聯繫我們

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