बैश स्क्रिप्टिंग: यदि तर्क इस स्ट्रिंग के बराबर है, तो इस स्ट्रिंग की तरह एक चर को परिभाषित करें


225

मैं कुछ बैश स्क्रिप्ट कर रहा हूं और अब मुझे एक वैरिएबल कॉल sourceऔर एक ऐरे मिला है samples, जैसे:

source='country'
samples=(US Canada Mexico...)

जैसा कि मैं स्रोतों की संख्या का विस्तार करना चाहता हूं (और प्रत्येक स्रोत के अपने नमूने हैं) मैंने ऐसा करने के लिए कुछ तर्क जोड़ने की कोशिश की। मैंने यह कोशिश की:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

लेकिन जब मैंने अपनी स्क्रिप्ट चलाई source countries.sh countryतो यह काम नहीं किया। मैं क्या गलत कर रहा हूं?


2
यह कैसे काम नहीं करता है? जब आप इसे चलाते हैं तो आपको एक त्रुटि मिलती है, या यह कहता है कि "फिर से कोशिश करें", या कुछ और?
बुराई otto

2
हां, आप सोच सकते हैं कि 'सवाल बहुत सीधा है'। लेकिन आप इस बारे में कुछ समय से सोच रहे हैं। कृपया आवश्यक आउटपुट और किसी भी त्रुटि संदेश को शामिल करने के लिए अपने प्रश्न को संपादित करने पर विचार करें। +1 वास्तव में किसी चीज़ की कोशिश करने और प्रश्न के अच्छे प्रारूपण के लिए। सौभाग्य।
शेल्टर

यह कोड प्रस्तावित और स्वीकृत समाधान के समान क्यों है? यह भ्रामक है ... मैं अनुमान लगा रहा हूं कि शुरुआती प्रश्न में रिक्त स्थान ब्रैकेट के ठीक बाद और यदि वाक्य के समापन कोष्ठक से पहले नहीं था?
स्टिफ

6
@Stef अगर तुम करीब से देखो, $1="country"बनाम$1 = "country"
विल

जवाबों:


413

रिक्त स्थान के बारे में मत भूलना:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

121
मैं विश्वास नहीं कर सकता कि मैं इस पर तीन घंटे व्यय, और केवल रिक्त स्थान की एक समस्या थी !!!! ... धन्यवाद @Alex
ऐलेजैंड्रो

1
samples="US Canada Mexico..."पहले सरणी निर्माण शुरू करने के बाद आप इसका उपयोग क्यों करते हैं samples=(US Canada Mexico...)?
उपयोगकर्ता अज्ञात

10
मैं इस मुद्दे के साथ भाग गया जब बाईं तरफ चर एक खाली स्ट्रिंग था। फिक्स था if [ "$1" = "country" ]; then
andrewb

8
ठीक है। बैश ने आधिकारिक रूप से सबसे पुरानी अभी तक उपयोग की जाने वाली कमांड भाषा के लिए मेरा वोट प्राप्त किया। सिंटैक्स सिर्फ इतना सहज है कि यह दर्द होता है। 2016+ में वास्तव में इसके लिए कोई जगह नहीं है। @ सिस्टेम लेखक: क्या आप कृपया "लिनक्स शेल का निर्माण कर सकते हैं जो आपकी अगली परियोजना को नहीं चूसता है"? मैं तुम्हारे ऊपर पैसे फेंक दूँगा।
मासी

3
@ कभी कभी मुझे लगता है कि यूनिक्स का मूल इरादा "अस्पष्टता के माध्यम से नौकरी की सुरक्षा" था। यदि उपकरण का उपयोग करने के लिए गूढ़ थे, तो समझना मुश्किल है, और आम तौर पर महान ज्ञान की पहुंच से बाहर है बिना अंदर के ज्ञान को मास्टर से पैडवान को सौंप दिया जाता है, यह सुनिश्चित करेगा कि उन लोगों के लिए हमेशा "पता" में काम होगा। यह दर्शन पूरे "RFC" निर्माण में स्पष्ट है, और मनुष्य के दस्तावेजों में उपयोग की जाने वाली फूलों की भाषा है, जो तकनीकी रूप से आपको उपकरण का उपयोग करने के तरीके के बारे में बता रही है, वास्तव में उपकरण का दस्तावेज होने की आवश्यकता को पूरा करने के लिए थे। थोड़ा बदल गया है।
unsynchronized

184

आप बैश में स्ट्रिंग तुलना के लिए या तो "=" या "==" ऑपरेटरों का उपयोग कर सकते हैं। महत्वपूर्ण कारक कोष्ठक के भीतर रिक्ति है। उचित विधि कोष्ठक के भीतर अंतर रखने के लिए है, और ऑपरेटरों के पास अंतर रखने के लिए है। कुछ उदाहरणों में विभिन्न संयोजन काम करते हैं; हालाँकि, निम्नलिखित एक सार्वभौमिक उदाहरण है।

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

इसके अलावा, ध्यान दें कि सिंगल ब्रैकेट की तुलना में डबल ब्रैकेट को थोड़ा अलग तरीके से संभाला जाता है ...

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

मुझे आशा है कि वह मदद करेंगे!


12

ऐसा लगता है कि आप अपने बैश स्क्रिप्ट में कमांडलाइन तर्कों को पार्स करना चाहते हैं। इसकी खोज मैंने हाल ही में की है। मुझे लगता है कि निम्नलिखित में आपको तर्क देने में सहायता मिलेगी:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

मैंने स्निपेट को एक टीएल के रूप में नीचे जोड़ा, डॉ

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts ht:r:p:v OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -t test -r सर्वर -p पासवर्ड -v

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