shell脚本写host类型executable
最近在做一个的项目,因为有些功能使用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命令相当强大,而且可以结合正则表达式使用,用它来处理一般都不会有问题。
如果要退出执行,可以直接用“exit”后面跟上一个数字表示退出代码,如果不加,系统默认为0,表示成功,0以外的数字表示失败(我没有查到怎样返回warning)。
成长
/ | \
学习 总结 分享
QQ交流群:122230156