每次解析参数,也可选择标记

时间:2017-01-26 22:20:17

标签: bash arguments options

我是bash脚本的新手。我有一个需要参数的bash脚本。每次争论都不一样。这意味着争论可能是任何事情:

./script arg

该脚本应该能够解析选项:

./script -a arg
./script -b arg
./script -c arg

但是如果没有给出选项(可选),脚本必须采用-a选项:

./script arg./script -a arg

相同

./script arg./script -b arg

不同

到目前为止,我建立了以下内容:

#!/bin/bash

    while getopts ":a:b:c:" opt; do
        case $opt in
            a) opta="true" ;;
            b) optb="true" ;;
            c) optc="true" ;;
            :) echo "option -${OPTARG} requires an argument."; exit 1;;
            \?) echo "unknown option -${OPTARG}"; exit 1;;
        esac
    done

    shift "$((OPTIND-1))"

但如果不知道如何继续。本网站的任何输入都无法回答我的问题。

修改

我找到了解决方案

prog_name=`basename $0`

a=
b=
c=
arg_idx=0

while test $# -gt 0; do
    case $1 in
        -*) opt_idx=1
                opt_char=0
                while test -n "$opt_char"; do
                    opt_idx=`expr $opt_idx + 1`
                    opt_char=`echo $1 | cut -c$opt_idx`
                    case $opt_char in
                        a) a="true" ;;
                        b) b="true" ;;
                        c) c="true" ;;
                        ?) echo "$prog_name: $opt_char: Invalid option"
                             exit 1 ;;
                    esac
                done ;;
        *)      arg_idx=`expr $arg_idx + 1`
                case $arg_idx in
                    1) arg="$1" ;;
                esac ;;
    esac
    shift
done

if [ "$arg_idx" -ne "1" ]; then
    echo "Usage: $prog_name [-a] [-b] [-c] <arg>" >&2
    exit 1
fi

后来在剧本中,我做了一个简单的条件:

if [ "${a}" == "true" ]; then
    runA
else
    if [ "${b}" == "true" ]; then
        runB
    else
        if [ "${c}" == "true" ]; then
            runC
        else
            runA
        fi
    fi
fi

0 个答案:

没有答案