如何在bash中同时支持短期和长期期权?

Xiè*_*léi 29 bash getopt getopt-long

我想在bash脚本中支持短期和长期选项,因此可以:

$ foo -ax --long-key val -b -y SOME FILE NAMES
Run Code Online (Sandbox Code Playgroud)

可能吗?

Bri*_*nts 38

getopt 支持长期选择.

http://man7.org/linux/man-pages/man1/getopt.1.html

以下是使用您的参数的示例:

#!/bin/bash

OPTS=`getopt -o axby -l long-key: -- "$@"`
if [ $? != 0 ]
then
    exit 1
fi

eval set -- "$OPTS"

while true ; do
    case "$1" in
        -a) echo "Got a"; shift;;
        -b) echo "Got b"; shift;;
        -x) echo "Got x"; shift;;
        -y) echo "Got y"; shift;;
        --long-key) echo "Got long-key, arg: $2"; shift 2;;
        --) shift; break;;
    esac
done
echo "Args:"
for arg
do
    echo $arg
done
Run Code Online (Sandbox Code Playgroud)

产量$ foo -ax --long-key val -b -y SOME FILE NAMES:

Got a
Got x
Got long-key, arg: val
Got b
Got y
Args:
SOME
FILE
NAMES
Run Code Online (Sandbox Code Playgroud)

  • 某些版本的`getopt`在参数和非选项参数中有一些字符存在问题.如果`getopt --test; echo $?`输出"4",你没问题.如果它输出"0"你有一个版本有这个问题.有关详细信息,请参阅[`man getopt`](http://linux.die.net/man/1/getopt). (9认同)