首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash getopts无法识别参数

bash getopts无法识别参数
EN

Stack Overflow用户
提问于 2013-07-16 12:46:45
回答 1查看 1.5K关注 0票数 1

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

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
#!/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进一步拆分参数,在这种情况下,即使选项被正确传递,getopts也不会被触发。

代码语言:javascript
复制
#!/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无法识别选项的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-16 13:53:03

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

第一次:

代码语言:javascript
复制
sh test.sh "-d somedesc -l somelabel"

第二次:

代码语言:javascript
复制
sh test.sh " -d anotherdesc -l anotherlabel"

因此,将参数列表转换为单参数和getops失败。

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

代码语言:javascript
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17668204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档