需求:某些脚本需要往服务器传数据(数据库、消息队列等),为了增加脚本的可移植性,一般使用传参的方式将连接服务器的数据信息传入脚本内
一般有两种方法传参
1、使用位置变量($1、$2、$3....):此方法的缺点是传值的顺序有严格要求,顺序错误将导致脚本执行失败
2、使用getopt/getopts:提供一个接收参数的选项,再根据选项获取对应的参数
getopt和getopts的区别是,getopt可以使用长选项名,而且功能更强大,但是使用起来更复杂,getopts只能使用短选项名,但是使用较为方便。
本次使用getopts方法传参,首先简单介绍一下该方法:
1、getopts是linux系统中的一个内置变量,一般用在循环中。
2、每次执行循环时,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。
3、getopts包含两个内置变量 ,OPTARG和OPTIND
4、其中合法选项保存在OPTARG这个内置变量中。
5、变量OPTIND表示参数位置信息
脚本范例:
cat test.sh
#!/bin/bash
while getopts ":a:b:c:" opt do case $opt in a) echo "a=$OPTARG" echo "$OPTIND" ;; b) echo "b=$OPTARG" echo "$OPTIND" ;; c) echo "c=$OPTARG" echo "$OPTIND" ;; *) echo "未知参数" exit 1 ;; esac done
sh test.sh -a 100 -b 200 -c 300 #执行结果 a=100 3 b=200 5 c=300 7
应用到实际生产环境中
#!/bin/bash while getopts ":h:p:u:P:d" opt do case $opt in h) mysqlip=$OPTARG ;; p) mysqlport=$OPTARG ;; u) mysqluser=$OPTARG ;; P) mysqlpasswd=$OPTARG ;; d) mysqldatabase=$OPTARG ;; *) echo "未知参数" exit 1 ;; esac done
#采集过滤内容省略 #mysql执行命令省略 mysql -u$mysqluser -P$mysqlpasswd --database "$mysqldatabase" -h$mysqlip -p$mysqlport -e "$mysql执行命令"
至此,采集脚本可以根据服务器的变化灵活传参,也增强了可移植性