shell脚本写host类型executable

最近在做一个的项目,因为有些功能使用ORACLEpackage实现起来有点问题,但是用UNIX的脚本实现起来却很好,所以最终在AP上挂了一个executableHOST类型的REQUEST,来解决这个问题。

因为觉得这个东西有点意思,所以把我了解到的一些很基本的东西share出来。


首先,必须有一个UNIX下面可以执行的shell script文件,而且这个文件必须放在相应Applicationbin目录下,例如,如果要将该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命令相当强大,而且可以结合正则表达式使用,用它来处理一般都不会有问题。

如果要退出执行,可以直接用“exit”后面跟上一个数字表示退出代码,如果不加,系统默认为0,表示成功,0以外的数字表示失败(我没有查到怎样返回warning)。

 

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

posted @ 2011-06-10 09:51  郭振斌  阅读(1464)  评论(0编辑  收藏  举报