कोसने के लिए विकल्पों को पार्स करना


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

मैं विकल्पों में रोटेशन स्टेट्स बनाना चाहता हूं क्योंकि वे केवल सामान्य हैं, दाएं बाएं और उल्टे हैं।

मुझे पता है कि मुझे उनमें से प्रत्येक के लिए एक केस बनाने की जरूरत है -r -l -i लेकिन ... मुझे प्रत्येक संयोजन के लिए भी एक मामला बनाने की आवश्यकता होगी? -और | क्या कोई सरल या विनम्र तरीका है?

धन्यवाद।


आप गेटटॉप का उपयोग कर सकते हैं stackoverflow.com/questions/16483119/... इस तरह
BlueBerry - Vignesh4303

@ ब्लूबेरी-विग्नेश 4303 यह लंबे नाम के विकल्प को नहीं तोड़ेगा --device?
RomuloPBenedetti

जवाबों:


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 कई बार विकल्प।


मैं अभी भी अपने "गंदे समाधान" का उपयोग करूंगा, मुझे एक सरल समाधान चाहिए जहां कोई कर सकता है script -di HDMI-0 DVI-1 दोनों डिस्प्ले को कवर करने के लिए डिवाइस को कैलिब्रेट करेगा और एक्सिस को पलटेगा, जहां 'i' को 'r' राइट, 'l' लेफ्ट या 'n' नॉर्मल में बदला जा सकता है। लेकिन मुझे वैसे भी विकल्प जानना पसंद था।
RomuloPBenedetti

वैकल्पिक रूप से, तर्क के रूप में एकल, अल्पविराम से अलग स्ट्रिंग दें -d, और फिर आप इसे एक सरणी में विभाजित कर सकते हैं।
glenn jackman

यह सच है, सब पर आपका समाधान एक वैध समाधान है और जैसा कि एक बेहतर जवाब मौजूद नहीं है, मैं इसे उत्तर के रूप में चिह्नित करूंगा, धन्यवाद।
RomuloPBenedetti
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.