脚本调用参数传递问题

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

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容