我需要在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
有什么建议吗?谢谢!
答案 0 :(得分:3)
当你试图运行它时,为什么这样引用?我很确定这就是你的意思:
./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
选项,将其视为参数。