बैश, नो-आर्ग्युमेंट्स चेतावनी और केस के फैसले


110

मैं बैश सीख रहा हूं।

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

मैं बैश में शुरुआती लोगों के लिए सर्वश्रेष्ठ ऑनलाइन मैनुअल के सुझावों को भी जानना चाहूंगा

धन्यवाद

जवाबों:


176
if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 0
fi

case "$1" in
    1) echo 'you gave 1' ;;
    *) echo 'you gave something else' ;;
esac

उन्नत बैश-पटकथा गाइड काफ़ी अच्छी है। अपने नाम के बावजूद, यह मूल बातों का इलाज करता है।


पुन: "बाहर निकलें 0"। मुझे नहीं पता कि क्या स्क्रिप्ट से बाहर निकलना उसके दिमाग में था। लेकिन हाँ, यह एक उत्कृष्ट मार्गदर्शक है।
ट्रैम्पस किर्क

मैंने "और" के रूप में "अन्यथा" की व्याख्या की, यह मानते हुए कि संदेश कुछ मदद पाठ होगा। लेकिन मुझे यकीन है कि वर्नर यह पता लगाने में सक्षम है कि वह रेखा क्या करती है और क्या वह यह चाहता है :)
थॉमस

धन्यवाद, निश्चित रूप से! और आखिरी बात, मैं कैसे स्क्रिप्ट के माध्यम से त्रुटि संदेशों को बंद कर सकता हूं, इसलिए उन्हें शेल में नहीं दिखाया गया है?
मार्ग

आप एक विशेष कार्यक्रम से आप कॉल कर रहे हैं से आने वाली त्रुटियों का मतलब है? आप इसके मानक उत्पादन और / या मानक त्रुटि धाराओं को विस्मरण में भेजने के लिए > /dev/nullऔर / या 2> /dev/nullउसके बाद रख सकते हैं ।
थॉमस

4
यदि आप किसी लापता तर्क को कुछ बुरा मानते हैं (जैसे स्क्रिप्ट तब सफलतापूर्वक प्रदर्शन नहीं कर सकती), 0 ( exit 1) से अलग कुछ लौटाएं । रिटर्न / एग्जिट कोड के बारे में और भी कयास लगाए जा रहे हैं, जिन्हें आप ऑनलाइन देख सकते हैं, लेकिन महत्वपूर्ण बिंदु यह है कि यह 0 नहीं होना चाहिए, जो सफलता का संकेत देता है।
फेलिक्स

25

यदि किसी विशेष तर्क के लापता होने पर केवल बाउलिंग में दिलचस्पी है, तो पैरामीटर प्रतिस्थापन महान है:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

11

उदाहरण

 if [ -z "$*" ]; then echo "No args"; fi

परिणाम

No args

विवरण

-z स्ट्रिंग की लंबाई के लिए यूनिरी ऑपरेटर शून्य है। $*सभी तर्क हैं। उद्धरण सुरक्षा के लिए हैं और यदि मौजूद हैं तो कई दलीलों को एनकैप्सुलेट करना है।

इस तरह के अधिक ऑपरेटरों के लिए "यूनरी" के लिए उपयोग man bashऔर खोज ( / कुंजी)।


7
इसके साथ एक (मामूली) समस्या यह है कि यह बिना किसी तर्क के और तर्क के रूप में एक रिक्त स्ट्रिंग को पारित करने के बीच अंतर नहीं करता है। कुछ संदर्भों में यह महत्वपूर्ण हो सकता है। [$ # -Eq 0] का उपयोग करके कोई भी दोनों मामलों को ठीक से संभाल सकता है।
इडेलिक

1
आह, (बा) श प्रोग्रामिंग की सूक्ष्मता ... यही कारण है कि मुझे इससे नफरत है।
थॉमस

1
मिज़िंग के -zरूप में सोचें
रे फॉस

4

पुराना है, लेकिन मेरे पास इस कारण को फिर से याद करने का कारण है कि पिछले कुछ भ्रमों के लिए धन्यवाद:

if [[ $1 == "" ]] #Where "$1" is the positional argument you want to validate 

 then
 echo "something"
 exit 0

fi

यदि कोई स्थिति तर्क $ 1 नहीं है तो यह "कुछ" प्रतिध्वनित करेगा। यह मान्य नहीं है कि $ 1 में विशिष्ट जानकारी शामिल है।


$#स्पष्ट रूप से तर्कों की संख्या की पूर्णांक संख्या है; यह या तो "0" होगा, और आप "कुछ" गूंजेंगे भले ही कोई तर्क न हो, या यह कुछ सकारात्मक संख्या होगी, और आप "कुछ" सही ढंग से गूंजेंगे। लेकिन चेक स्वयं कभी भी कुछ भी नहीं करेगा, भले ही इनपुट या आपके द्वारा उपयोग किए जाने वाले इनपुट की कमी के बावजूद - यह हमेशा रिपोर्ट करेगा कि $#इसमें एक मूल्य शामिल है। इसलिए यह पूरी तरह से गलत है और कभी भी दावा के अनुसार काम नहीं करेगा।
एशवार्ट्ज

क्या आप पूरी तरह से सकारात्मक हैं? मेरे पास कई स्क्रिप्ट हैं जो इस सटीक प्रारूप का उपयोग करते हुए काम करती हैं। आपकी प्रतिक्रिया को पढ़ने के बाद मैंने मैच के लिए दोनों को रिटेन किया और उसमें कमी थी। $ # में एक मान नहीं होगा यदि निर्दिष्ट नहीं है, यदि आपके परिदृश्य में कभी भी # मिलान करने के लिए कोई स्थितिगत तर्क नहीं है। इसका कोई मतलब नहीं है कि बैश एक माननीय तर्क में मान क्यों नहीं है।
रेयान स्मिथ

echo $#एक स्क्रिप्ट /tmp/test.sh की सामग्री के रूप में प्रयास करें , फिर इसे / बिन / बैश के साथ-साथ / बिन / श (या / बिन / डैश और जो भी अन्य शेल कार्यान्वयन आपके पास उपलब्ध हैं) के तहत चलाएं। /tmp/test.sh"0" करने के लिए गूंज होगी । कंसोल, जैसा कि होगा /bin/dash /tmp/test.sh। दूसरी ओर, /tmp/test.sh foo"1" /tmp/test.sh first secondकी प्रतिध्वनि करेगा , और "2" की प्रतिध्वनि करेगा।
eswwartz

के अनुसार man bash, अनुभाग "विशेष पैरामीटर", में, "दशमलव में स्थितीय पैरामीटर की संख्या के लिए # का विस्तार।" "खोल व्यवहार करता है कई मापदंडों विशेष रूप से ये पैरामीटर केवल संदर्भित किया जा सकता है। उन्हें काम की अनुमति दी है नहीं।", और इसी तरह POSIX द्वारा शासित है
eschwartz

क्षमा करें ऐसा लगता है कि एक गलत संचार था! मेरा मतलब था # विशिष्ट स्थिति तर्क के लिए एक स्थान धारक के रूप में (यानी, $ 2 यदि आप दूसरे तर्क का मतलब है) शाब्दिक $ # नहीं। अपने ऊपर की समीक्षा करने के बाद आप बिल्कुल सही हैं, एक शाब्दिक $ # हमेशा तर्कों की संख्या का समाधान करेगा। भ्रम के लिए क्षमा याचना।
रयान स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.