我想写一个脚本,你可以给它几个参数:
while getopts ":a:b:c:" opt; do case $opt in a) echo "-a was triggered ;; b) echo "-b was triggered ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done
我现在的代码工作,但我的问题是,如果它结合,我想给另一个函数/回声。
示例:当我这样做时:.MyScript -ab应该给出另一个函数,即在“a”或者“b”
所以有点像:
ab) -> Script -a -b or Script -ab echo "-ab was triggered"
什么是最好的解决scheme呢? 任何想法,你的自由张贴!
while getopts ":a:b:c:" opt; do case $opt in a) echo "-a was triggered" a_val=$OPTARG ;; b) echo "-b was triggered" b_val=$OPTARG ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done if [[ -n $a_val ]]; then do something with "$a_val"; fi if [[ -n $b_val ]]; then do something with "$b_val"; fi
这可能会导致混淆的唯一情况是,如果用户通过-a ""
– 一个解决方法是:
a=false b=false while getopts ":a:b:c:" opt; do case $opt in a) echo "-a was triggered"; a_val=$OPTARG; a=true ;; b) echo "-b was triggered"; b_val=$OPTARG; b=true ;; esac done if $a; then do something with "$a_val"; fi if $b; then do something with "$b_val"; fi
这里没有括号: if $a; then ...
if $a; then ...
因为我正在调用命令 “true”或“false”并按照退出状态进行操作。
更新
您可以使用getopt(1) linux实用程序。 这不是一个bash内部函数,但是这可以处理很长的参数。
尝试这个:
declare -A OPTARG GetOpt() { local prog="${BASH_SOURCE[0]}" [ $# -eq 0 ] && echo "$prog: Bad call of GetOpts">&2 && exit 1 local longopt="$1" shift local tmp tmp=$(getopt -n"$prog" -a -l "$longopt" -- '' "$@") || exit eval "tmp=($tmp)" local i for((i=0;i<${#tmp[*]};++i)){ key=${tmp[i]#--} [ -z "$key" ] && break if [[ "${tmp[i+1]}" =~ ^-- ]]; then OPTARG[$key]=1 else OPTARG[$key]="${tmp[++i]}" fi } for((j=0;++i<${#tmp[*]};++j)){ OPTFILE[j]=${tmp[i]};} } GetOpt "ab ab file:" "$@" [ "${OPTARG[a]}" -a "${OPTARG[b]}" ] && OPTARG[ab]=1 && unset OPTARG[a] OPTARG[b] [ "${OPTARG[a]}" ] && echo Do a [ "${OPTARG[b]}" ] && echo Do b [ "${OPTARG[ab]}" ] && echo Do ab
定义的GetOpt
函数将解析的命令行参数与选中的长选项放到名为OPTARG
的关联数组OPTARG
。 如果出现错误,则将无法通知问题。
通过getopt
的-a
选项,您可以使用-ab
或--ab
格式。 请记住,如果你有del
定义,那么-d
选项(如果-d
没有指定)将扩展到--del
。
如果您使用附加选项指定一个arg,它可以包含空格。 例如,如果-l file:
在getopt
定义,那么它可以用作./test --file="qw"
。 ${OPTARG[file]}
将是qw
。
OPTFILE
数组包含可选参数(在--
之后给出的参数)。