आधारित इस उत्तर पर मैंने कुछ सरल वैकल्पिक तर्क पार्सर लिखा था
#!/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
मैं क्या गलत कर रहा हूं?
1 उत्तर
अतिरिक्त shift
निकालें।
अर्थात्:
case $1 in
-v|--valgrind) VALGRIND="valgrind --track-origins=yes";;
-t|--test) TEST="mickey goofy";;
*) ARGS+=( "$1" );;
esac
आपको अपने व्यक्तिगत मामलों के अंदर केवल एक अतिरिक्त shift
करना चाहिए जब आप जिस विकल्प को संसाधित कर रहे हैं वह एक विकल्प-तर्क लेता है, और प्रसंस्करण जारी रखने से पहले आपको उस विकल्प-तर्क को तर्क वेक्टर से निकालना होगा।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
bash
बैश कमांड शेल के लिए लिखी गई लिपियों के बारे में प्रश्नों के लिए। त्रुटियों / वाक्यविन्यास त्रुटियों के साथ शेल स्क्रिप्ट के लिए, कृपया यहां पोस्ट करने से पहले शेलचेक प्रोग्राम (या वेब शेलचेक सर्वर पर https://shellcheck.net) के साथ उन्हें जांचें। बैश के इंटरैक्टिव उपयोग के बारे में सवाल स्टैक ओवरफ्लो की तुलना में सुपर उपयोगकर्ता पर ऑन-टॉपिक होने की अधिक संभावना है।