一、getopts的问题
如下使用getopts时,当执行命令为 #sh test1.sh -s “A B C” 时, getopts只能解析到 -s A,空格后面的内容就没办法解析了,其实在使用$@给fun_main函数传参的时候"A B C"就被分割成了三个参数了。
#!/bin/sh
#test1.sh
function fun_get_opts() {
while getopts "s:" optname
do
case "$optname" in
"s")
echo ${OPTARG} # echo A
;;
esac
done
}
function fun_main() {
fun_get_opts $@
...
exit 0
}
fun_main $@
因为$@传参时默认以空格分割,因此,我们可以使用别的符号进行分割,使用完后再恢复,将正确分割的参数存入数组中进行保存,避免多次传参后又被分割。代码如下:
二、正确的写法
#!/bin/sh
#test2.sh
declare -a argsArray #声明一个数组存放参数
function fun_get_opts() {
for((i=0;i<${#argsArray[@]};i++))
do
case ${argsArray[i]} in
"-s")
let i=i+1
echo ${argsArray[i]} #取 -s 后面的参数, echo “A B C”
;;
esac
done
}
function fun_main() {
fun_get_opts
...
exit 0
}
IFS_OLD=$IFS #保存老的分隔符
IFS=$'?' #以?作为分隔符
argsArray=($@)
fun_main
IFS=${IFS_OLD} #别忘了恢复分隔符