【问题标题】:bash getopts not able to recognize argumentsbash getopts 无法识别参数
【发布时间】:2013-07-16 04:46:44
【问题描述】:

我们有一个getopts 脚本来检索如下参数

#!/bin/bash
while getopts ":d:l:f:o:" OPT;
do
    echo 'In Test Script - Got Options '$OPT ' with' $OPTIND ' and ' $OPTARG
    case $OPT in
        d)
            echo $OPTARG;;
        f)
            echo $OPTARG;;
        l)
            echo $OPTARG;;
        ?)
            echo $OPTARG;;
    esac
done

我们收到一个在另一个脚本中解析并传递给getopts 脚本的参数,它适用于单个条目,例如12345,-d somedesc -l somelabel

#!/bin/bash
INFO="12345,-d somedesc -l somelabel"
ID=`echo "$INFO" | awk -F "," "{ print $"1" }"`
OPTIONS=`echo "$INFO" | awk -F "," "{ print $"2" }"`
sh test.sh $OPTIONS

但是,我们会收到多个条目,例如12345,-d somedesc -l somelabel:6789, -d anotherdesc -l anotherlabel 并使用 loopawk 进一步拆分参数,在这种情况下,即使正确传递了 OPTIONS,getopts 也不会被触发。

#!/bin/bash
INFO="12345,-d somedesc -l somelabel:6789, -d anotherdesc -l anotherlabel"
IFS=":"
set $INFO
echo 'Parsing INFO '$INFO
for item
do
    echo 'Item is '$item
    #parsing each item to separate id and options
    ID=`echo "$item" | awk -F "," "{ print $"1" }"`
    echo 'ID is '$ID
    OPTIONS=`echo "$item" | awk -F "," "{ print $"2" }"`
    echo 'Invoking Test Script with '$OPTIONS
    sh test.sh $OPTIONS
done

getopts 无法识别 OPTIONS 的任何原因?

【问题讨论】:

    标签: linux bash awk getopts


    【解决方案1】:

    问题是您将脚本顶部的 IFS 值更改为冒号 :,然后将参数传递给脚本 test.sh,而 IFS 仍设置为 :。实际上被称为:

    第一次:

    sh test.sh "-d somedesc -l somelabel"
    

    第二次:

    sh test.sh " -d anotherdesc -l anotherlabel"
    

    因此将参数列表变成单个参数,getops 失败。

    您需要做的是在将其设置为冒号之前保存原始 IFS,并在设置命令后将其恢复,如下所示:

    #!/bin/bash
    INFO="12345,-d somedesc -l somelabel:6789, -d anotherdesc -l anotherlabel"
    # save IFS value
    OLDIFS=$IFS
    IFS=":"
    set $INFO
    # restore saved IFS value
    IFS=$OLDIFS
    
    echo 'Parsing INFO '$INFO
    for item
    do
        echo 'Item is '$item
        #parsing each item to separate id and options
        ID=`echo "$item" | awk -F "," "{ print $"1" }"`
        echo 'ID is '$ID
        OPTIONS=`echo "$item" | awk -F "," "{ print $"2" }"`
        echo 'Invoking Test Script with '$OPTIONS
        sh test.sh $OPTIONS
    done
    

    【讨论】:

    • 即使在恢复 IFS 值之后 getopts 也无法重新调整各个参数。不打印来自 test.sh 的回声。
    • 你在什么平台上测试?在发布之前我已经测试了很多次。
    • Red Hat 4.1.2-50 - Linux 版本 2.6.18-308.el .. 让我检查其他机器并恢复。
    • 无论如何你应该先做一件事。不要使用sh test.sh $OPTIONS,而是使用bash test.sh $OPTIONS,因为您使用的是bash。
    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2022-11-22
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多