问题场景:我们部署脚本到数据库主备服务器上时,脚本在主备库上的行为有差异,且我们期望当数据库角色切换后,不用DBA的介入,脚本能感知角色变化。这个要求本可以通过在脚本里添加角色判断来实现,但这意味着,我们需要在非常多的既有脚本里寻找需要进行角色判断的地方,改动的地方较大。因此我们选择了另外一种方案,加一个外部调用脚本,这个脚本进行角色判断,然后调用相应行为的脚本。
我们发现,通过传递给调用脚本(下面的 invoker.ksh)来把参数传递给被调用脚本(下面的t.ksh)时,会出现参数丢失的情况。
[Mason@oc8130141717 shell]$ cat invoker.ksh
#!/bin/ksh
cmd="${*}"
./$cmd
[Mason@oc8130141717 shell]$
[Mason@oc8130141717 shell]$ cat t.ksh
#!/bin/ksh
while getopts ":c:d:" opt
do
case ${opt} in
c ) command_parms=${OPTARG} ;;
d ) database=${OPTARG} ;;
esac
done
echo "command_parms: $command_parms"
[Mason@oc8130141717 shell]$
# 通过-c 传递的参数部分丢失
# 仅abc传递过去了,def hij丢失
[Mason@oc8130141717 shell]$ ./invoker.ksh t.ksh -c "abc def hij"
command_parms: abc
# 其中一种解决方案如下
[Mason@oc8130141717 shell]$
[Mason@oc8130141717 shell]$ cat invoker.ksh
#!/bin/ksh
cmd="${*}"
eval ./$cmd
[Mason@oc8130141717 shell]$ cat t.ksh
#!/bin/ksh
while getopts ":c:d:" opt
do
case ${opt} in
c ) command_parms=${OPTARG} ;;
d ) database=${OPTARG} ;;
esac
done
echo "command_parms: $command_parms"
[Mason@oc8130141717 shell]$
[Mason@oc8130141717 shell]$ ksh invoker.ksh ./t.ksh -c "'abc def hij'"
command_parms: abc def hij
--End
Mason
网友评论