phân tích cú pháp tùy chọn để bash


1

Tôi có một cái gì đó như thế này:

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

Tôi muốn tạo các trạng thái xoay trong các tùy chọn vì chúng chỉ bình thường, phải trái và đảo ngược.

Tôi biết tôi cần tạo một trường hợp cho mỗi trường hợp -n -r -l -i nhưng ... tôi cũng sẽ cần tạo một trường hợp cho mỗi kết hợp chứ? -nd | -dn, -rd | -dr ... Có cách nào đơn giản hay lịch sự hơn không?

Cảm ơn.


bạn có thể sử dụng getopts stackoverflow.com/questions/16483119/... như thế này
Blueberry - Vignesh4303

@ Blue BlackBerry-Vignesh4303 Nó sẽ không phá vỡ các tùy chọn tên dài như thế --devicenào?
RomuloPBenedetti

Câu trả lời:


1

sử dụng getoptđể kích hoạt các tùy chọn dài và ngắn, cũng như -rdnghép tùy chọn

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

Một tùy chọn chỉ có thể lấy không hoặc một đối số. Để chỉ định nhiều thiết bị, sử dụng -d argtùy chọn nhiều lần.


Tôi vẫn sẽ sử dụng "giải pháp bẩn" của mình, tôi muốn một giải pháp đơn giản trong đó ai đó có thể làm script -di HDMI-0 DVI-1những gì sẽ hiệu chỉnh thiết bị để che cả màn hình và đảo ngược trục, trong đó 'i' có thể được thay đổi thành 'r' phải, 'l' trái hoặc 'n' bình thường. Nhưng dù sao thì tôi cũng muốn biết cách thay thế.
RomuloPBenedetti

Cách khác, đưa ra một chuỗi, được phân tách bằng dấu phẩy làm đối số -dvà sau đó bạn có thể chia chuỗi thành một mảng.
glenn jackman

Đây là sự thật, giải pháp của bạn hoàn toàn là một giải pháp hợp lệ và vì dường như không tồn tại một câu trả lời tốt hơn, tôi sẽ đánh dấu nó là câu trả lời, cảm ơn.
RomuloPBenedetti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.