1

У меня есть что-то вроде этого:

while [[ $# > 0 ]] ; do
    key="$1"
    count=0
    echo "$1"
    case "$key" in
        -r|--rotate)
            shift
            rotate $1
            shift
            ;;
        -d|--devices)       
            shift
            while [[ "$1" != "-"* && "$1" != "" ]] ; do
                disps["$count"]="$1"
                ((count++))
                shift
            done
            calibrate disps[@]
            ;;
        -h|--help)
            shift
            usage
            ;;
        *)
            shift
            usage
            ;;
    esac
done

Я хочу сделать ротацию состояний в опциях, так как они только нормальные, правый левый и инвертированный.

Я знаю, что мне нужно создать дело для каждого из них -n -r -l -i, но ... Мне нужно будет создать кейс для каждой комбинации тоже? -nd | -dn, -rd | -dr ... Есть ли более простой или вежливый способ?

Благодарю.

1 ответ1

1

используйте getopt для включения длинных и коротких опций, а также конкатенации опций -rdn

parsed_options=$( getopt -o r:d:h --long rotate:,device:,help --name "$(basename -- "$0")" -- "$@" )
# option name followed by a single colon indicates the option takes
# a required argument

if [ $! -ne 0 ]; then
    echo "Exiting" >&2
    exit 1
fi

eval set -- "$parsed_options"

disps=()

while :; do
    case "$1" in
        -r|--rotate)
            rotate "$2"
            shift 2
            ;;
        -d|--device)       
            disps+=("$2")   # append the arg to the disps array
            shift 2
            ;;
        -h|--help) usage; exit ;;
        --) shift; break ;;
        *) echo "Internal error" >&2; exit 1 ;;
    esac
done

if (( ${#disps[@]} == 0 )); then
    echo "no devices to calibrate"
else
    calibrate "${disps[@]}"
fi

Опция может принимать только ноль или один аргумент. Чтобы указать много устройств, используйте опцию -d arg много раз.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .