【问题标题】:getopts truncates argument valuegetopts 截断参数值
【发布时间】:2012-03-08 04:00:46
【问题描述】:

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

有什么建议吗?谢谢!

【问题讨论】:

    标签: bash shell getopts


    【解决方案1】:

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

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

    【讨论】:

    • +1 你说得对,我弄错了,呵呵。我将我的标记为删除,因为它是错误的。
    • 很高兴我能帮上忙!听起来你至少有很好的直觉:如果你看到有空格分割的东西,这可能是一个引用问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2014-03-09
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多