首页 > 解决方案 > /bin/sh:使用 getopt 解析长选项,格式为 --parameter='value'

问题描述

我有以下片段来解析/bin/dash.

该选项-n|--dry-run不带任何参数。但--exclude应该采用 . 形式的字符串--exclude='foo'。使事情进一步复杂化,--exclude没有短期的选择。

以下代码在我使用时有效script.sh --exclude,但是当我使用时script.sh --exclude='foo',出现错误:

option '--exclude' doesn't allow an argument

这是我的代码:

#!/bin/sh

 OPTS=$(getopt --options 'n' --long 'exclude,dry-run' --name "$0" -- "$@")

 if [ $? != 0 ] ; then
    printf "\n\033[1;31m Error:\033[0m Failed to parse options...exiting.\n\n"
    exit 1
 fi

 eval set -- "$OPTS"

 unset OPTS

# extract options and their arguments into variables.
 while true ; do
    case "$1" in

    --exclude )
        EXCLUDE="y"
        shift
        ;;

    -n | --dry-run )
        DRYRUN="y"
        shift
        ;;

    -- )
        shift
        break
        ;;

    *)
        printf "\n\033[1;31m Error:\033[0m Invalid option: \033[1;31m-$OPTARG\033[0m\n\n"
        exit 1
        ;;

    esac
 done


 echo \$\@ = $@

我必须改变什么才能使用--exclude='foo'

标签: shellcommand-lineshgetopt

解决方案


您需要通过将 a 附加到名称来指定--exclude可以接受参数。:

OPTS=$(getopt --options 'n' --long 'exclude:,dry-run' --name "$0" -- "$@")

从手册页:

-l, --longoptions longopts

要识别的长(多字符)选项。通过用逗号分隔名称,可以一次指定多个选项名称。此选项可能不止一次给出,longopts 是累积的。 longopts 中的每个长选项名称后面可以跟一个冒号表示它有一个必需的参数,后面跟两个冒号表示它有一个可选的参数。


推荐阅读