/bin/sh:使用 getopt 解析长选项,形式为 --parameter='value'

/bin/sh: parse long options using getopt, in the form --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 "[=13=]" -- "$@")

 if [ $? != 0 ] ; then
    printf "\n3[1;31m Error:3[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 "" in

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

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

    -- )
        shift
        break
        ;;

    *)
        printf "\n3[1;31m Error:3[0m Invalid option: 3[1;31m-$OPTARG3[0m\n\n"
        exit 1
        ;;

    esac
 done


 echo $\@ = $@

我需要更改什么才能使用 --exclude='foo'

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

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

来自手册页:

-l, --longoptions longopts

The long (multi-character) options to be recognized. More than one option name may be specified at once, by separating the names with commas. This option may be given more than once, the longopts are cumulative. Each long option name in longopts may be followed by one colon to indicate it has a required argument, and by two colons to indicate it has an optional argument.