sh脚本中使用getopts解析的参数中含有空格的解决方法

一、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} #别忘了恢复分隔符

你可能感兴趣的:(shell,shell)