首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >处理未使用的getopts参数

处理未使用的getopts参数
EN

Stack Overflow用户
提问于 2018-09-13 17:43:34
回答 2查看 1.3K关注 0票数 2

我有一个以getopts开头的脚本,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
USAGE() { echo -e "Usage: bash $0 [-w <in-dir>] [-o <out-dir>] [-c <template1>] [-t <template2>] \n" 1>&2; exit 1; }

if (($# == 0))
then
    USAGE
fi

while getopts ":w:o:c:t:h" opt
do
    case $opt in
        w ) BIGWIGS=$OPTARG
        ;;
        o ) OUTDIR=$OPTARG
        ;;
        c ) CONTAINER=$OPTARG
        ;;
        t ) TRACK=$OPTARG
        ;;
        h ) USAGE
        ;;
        \? ) echo "Invalid option: -$OPTARG exiting" >&2
        exit
        ;;
        : ) echo "Option -$OPTARG requires an argument" >&2
        exit
        ;;
    esac
done

more commands etc

echo $OUTDIR
echo $CONTAINER

我对老头子很陌生。我在这个脚本上做了一些测试,在某个阶段,我不需要/不想使用-c参数-c。换句话说,我试图测试脚本的另一个特定部分,根本不涉及$CONTAINER变量。因此,我简单地在所有命令前面添加了#和$CONTAINER,并做了一些测试,这是很好的。

在不使用$CONTAINER测试脚本时,我输入了以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
bash script.bash -w mydir -o myoutdir -t mywantedtemplate

然而,我想知道,鉴于我的头领命令,我没有收到警告。换句话说,为什么我没有收到关于-c论点的警告。这个是可能的吗?此警告是否仅在我键入:

代码语言:javascript
代码运行次数:0
运行
复制
bash script.bash -w mydir -o myoutdir -t mywantedtemplate -c

更新

在做了一些测试之后,我想这就是:

  • 如果您没有显式地编写"-c",getopts就不会向您“询问”它并给您一个错误(除非您的脚本正在使用它做一些事情-也就是说,如果您没有使用这个参数将#放在每个命令的前面)
  • 只有在输入"-c“时才会出现错误

这是正确的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-14 19:42:42

当不使用某些选项(即它们是可选的)时,getopts不会发出警告。通常,这是一件好事,因为有些选项(例如-h)不与其他选项一起使用。没有办法直接用Bash内置的getopts指定强制选项。如果您想要强制选项,那么您需要编写代码来检查它们是否已被使用。见bash getopts with multiple and mandatory options。此外(正如您已经发现的),如果您不能编写代码来处理optstring (first)参数中指定给getopts的选项,则不会出现错误。

通过在Bash代码中使用nounset设置(使用set -o nounsetset -u),您可以获得强制参数的自动警告。如果没有指定echo $CONTAINER选项,因此不会设置$CONTAINER,这将导致对像-c这样的代码发出警告。但是,使用nounset选项将意味着需要更仔细地编写代码的所有。有关更多信息,请参见How can I make bash treat undefined variables as errors?,包括注释和“链接”答案。

票数 2
EN

Stack Overflow用户

发布于 2021-11-24 11:02:31

您可以使用以下脚本:

printf捕获stdout并放入stderr,然后返回到stdout也捕获exit代码,因此如果代码大于0,我们可以处理。

代码语言:javascript
代码运行次数:0
运行
复制
some_command() {
    echo 'this is the stdout'
    echo 'this is the stderr' >&2
    exit 1
}

run_command() {
    {
        IFS=$'\n' read -r -d '' stderr;
        IFS=$'\n' read -r -d '' stdout;
        (IFS=$'\n' read -r -d '' _ERRNO_; exit ${_ERRNO_});
    } < <((printf '\0%s\0%d\0' "$(some_command)" "${?}" 1>&2) 2>&1)
}

echo 'Run command:'
if ! run_command; then
    ## Show the values
    typeset -p stdout stderr
else
    typeset -p stdout stderr
fi

只需将some_command替换为getopts ":w:o:c:t:h"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52319119

复制
相关文章

相似问题

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