Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash getopts截断参数值_Bash_Shell_Getopts - Fatal编程技术网

Bash getopts截断参数值

Bash getopts截断参数值,bash,shell,getopts,Bash,Shell,Getopts,我需要在myscript.sh中传递一个包含空格as选项的字符串值 代码如下所示: 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

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

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甚至没有通过(可能是新行)


有什么建议吗?谢谢

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

./myscript.sh -m 1 -i "$I" -t 2142
双引号将其中的所有字符都视为文字,除了允许展开变量的少数内容,包括
$
。单引号也会停止变量扩展。它们各自保护另一种类型的引号,因此,
只是一个
字符,
只是一个
字符


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

+1您是对的,我犯了一个错误,呵呵。我将我的标记为删除,因为它是错误的。很高兴我能帮上忙!听起来你至少有很好的直觉:如果你看到有东西在空格上分裂,那可能是引用的问题。
./myscript.sh -m 1 -i "$I" -t 2142