getopts截断参数值

时间:2012-02-16 18:09:43

标签: bash shell getopts

我需要在myscript.sh中传递一个包含间距作为选项的字符串值 代码如下所示:

while getopts "m:i:t:" OPTION
do
 case $OPTION in
     m)
         M=$OPTARG
         echo M: $M
         ;;
     i)
         I=$OPTARG
         echo I: $I
         ;;
     t)
         T=$OPTARG
         echo T: $T
         ;;
     ?)
         usage
         exit
         ;;
 esac
done

当我直接在命令行上调用它时,它工作得很好:

./myscript.sh -m 1 -i '0 1 2 3' -t '2142'
M: 1
I: 0 1 2 3
T: 2142

但是,我需要将-i作为字符串变量传递,我无法使其工作。选项-i的字符串被截断,选项-t甚至没有通过(可能是新行)。

I='0 1 2 3'
./myscript.sh -m 1 -i "'"$I"'" -t '2142'
M: 1
I: '0

I='0 1 2 3'
II="'"$(echo $I)"'"
./myscript.sh -m 1 -i $II -t '2142'
M: 1
I: '0

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:3)

当你试图运行它时,为什么这样引用?我很确定这就是你的意思:

./myscript.sh -m 1 -i "$I" -t 2142

双引号将其中的所有字符视为文字,除了一些内容,包括$,它允许扩展变量。单引号也会停止变量扩展。它们各自保护其他类型的引用,因此"'"只是'字符,'"'只是"字符。

这意味着"'"$I"'"变为'0 1 2 3',对单引号没有特殊含义,并且没有对空格的保护 - 您也可以将其写为\'0 1 2 3\'。空格,不受保护,分割单词,所以第一个单词是\'0。因此,您的脚本会将其视为选项的值,123'作为额外参数。如果在while循环之后添加shift $((OPTIND - 1))以移除已解析的选项,然后在解析选项后再echo "arguments: $@",则可以看到这一点。您还会看到,由于getops期望所有选项在前面,所以这会导致您错过-t选项,将其视为参数。