आधारित इस उत्तर पर मैंने कुछ सरल वैकल्पिक तर्क पार्सर लिखा था

#!/bin/bash
TEST_PATH=pluto
if [ $# -eq 0 ]; then
    echo "Usage:"
    echo "./run.sh [--valgrind|-v] [--test|-t] <mesh.dat> <csv_points_file>"
else
    . config.sh
    while [[ "$#" -gt 0 ]]; do
        case $1 in
            -v|--valgrind) VALGRIND="valgrind --track-origins=yes"; shift ;;
            -t|--test) TEST="mickey goofy" shift ;;
            *) ARGS+=($1) shift ;;
        esac
        shift
        echo $TEST
    done
    echo ${VALGRIND} ${TEST_PATH} "${ARGS[*]:-$TEST}"
fi

./somescript.sh -v को निष्पादित करने के अलावा आउटपुट सही है, जबकि -t तर्क के साथ TEST_PATH के सही मान के अलावा कुछ भी नहीं है। अपेक्षित व्यवहार होना चाहिए था

$./somescript.sh -t
pluto mickey goofy

$./somescript.sh daffy duck
pluto daffy duck

मैं क्या गलत कर रहा हूं?

0
Eugenio 25 अगस्त 2020, 00:42

1 उत्तर

सबसे बढ़िया उत्तर

अतिरिक्त shift निकालें।

अर्थात्:

        case $1 in
            -v|--valgrind) VALGRIND="valgrind --track-origins=yes";;
            -t|--test) TEST="mickey goofy";;
            *) ARGS+=( "$1" );;
        esac

आपको अपने व्यक्तिगत मामलों के अंदर केवल एक अतिरिक्त shift करना चाहिए जब आप जिस विकल्प को संसाधित कर रहे हैं वह एक विकल्प-तर्क लेता है, और प्रसंस्करण जारी रखने से पहले आपको उस विकल्प-तर्क को तर्क वेक्टर से निकालना होगा।

2
2 revs 25 अगस्त 2020, 21:12