脚本调用参数传递问题

2018-09-28  本文已影响0人  非典型IT

问题场景:我们部署脚本到数据库主备服务器上时,脚本在主备库上的行为有差异,且我们期望当数据库角色切换后,不用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

上一篇 下一篇

猜你喜欢

热点阅读