1

我需要在 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

有什么建议么?谢谢!

4

1 回答 1

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选项,也将其视为参数。

于 2012-02-16T18:27:19.993 回答