我已经知道getopts,这很好,但令人讨厌的是,即使是强制性参数,你也必须有一个标志。
理想情况下,我想要有一个脚本可以接收以下形式的参数:
script.sh [optional arguments] [anything required]
例如
script.sh -rvx output_file.txt
据我所知,使用getopts,它必须看起来像:script.sh -rvx -f output_file.txt,那只是不是很干净。
如果需要,我也可以使用python,但只有2.4可用,这是一个有点过时。
不要使用getopts builtin,请改用getopt(1)。他们(细微)不同,做不同的事情很好。对于您的情况,您可以这样做:
#!/bin/bash eval set -- $(getopt -n $0 -o "-rvxl:" -- "$@") declare r v x l declare -a files while [ $# -gt 0 ] ; do case "$1" in -r) r=1 ; shift ;; -v) v=1 ; shift ;; -x) x=1 ; shift ;; -l) shift ; l="$1" ; shift ;; --) shift ;; -*) echo "bad option '$1'" ; exit 1 ;; *) files=("${files[@]}" "$1") ; shift ;; esac done if [ ${#files} -eq 0 ] ; then echo output file required exit 1 fi [ ! -z "$r" ] && echo "r on" [ ! -z "$v" ] && echo "v on" [ ! -z "$x" ] && echo "x on" [ ! -z "$l" ] && echo "l == $l" echo "output file(s): ${files[@]}"
编辑:为了完整,我提供了一个处理需要参数的选项的例子。