यदि स्थिति में ब्रैकेट्स: मुझे व्हाट्सएप के बिना सिंटैक्स त्रुटियां क्यों हो रही हैं?


17

मैं दो दिन पहले स्थानांतरित करने के लिए नीचे की स्क्रिप्ट का उपयोग कर रहा हूं जब स्क्रिप्ट वर्ष के दो दिन शुरू होती है और हर महीने के पहले और दूसरे दिन की भी जांच करें और दो दिन पहले स्थानांतरित करें।

if [$month="01"] && [$day="01"];
then
    date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
         date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
   if [ $day = "01" ];
then
    date="$last_month/$yes_day/$year"
            fulldate="$year$last_month$yes_day"
else
        if [ $day = "02" ];
then
    date="$last_month/$yes_day/$year"
        fulldate="$year$last_month$yes_day"
else
    date="$month/$yes_day/$year"
        fulldate="$year$month$yes_day"
                fi
               fi
              fi
fi

लेकिन मेरा बुरा नीचे त्रुटि संदेश मिल रहा है

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

1
दिए गए उत्तर सही हैं; आपको व्हाट्सएप की जरूरत है [। इसके अतिरिक्त, elifकथन में देखें; यह आपको चीजों को साफ करने में मदद करेगा। इसके अलावा, अगर बयानों के बाद अर्धविराम जरूरी नहीं है, लेकिन यह भी गलत नहीं है, बस अजीब है।
शॉन जे। गोफ

@ ShawnJ.Goff वे आवश्यक हैं यदि आप अगली पंक्ति ( if [ ... ]; then) को बदलते हैं , तो यह असामान्य नहीं है।
सुनहरी जुराब 4'14

@goldilocks, हाँ, यह मेरी पसंदीदा शैली है। इसका कारण असामान्य है क्योंकि वह ऐसा नहीं कर रहा है।
शॉन जे। गोफ

जवाबों:


27

[न तो एक मेटाचैकर है और न ही एक नियंत्रण ऑपरेटर (एक आरक्षित शब्द भी नहीं; उसी के लिए ]) इस प्रकार इसके चारों ओर व्हाट्सएप की जरूरत है। अन्यथा शेल कमांड "देखता है" [01=01]बजाय कमांड के [अलग मानकों के साथ 01, =, 01, और ]। प्रत्येक ऑपरेटर और ऑपरेटर को [कमांड के लिए एक अलग तर्क की आवश्यकता होती है , इसलिए ऑपरेटरों के आसपास भी व्हाट्सएप आवश्यक है।

if [ "$month" = "01" ]

[$month="01"]एक वाइल्डकार्ड में वर्णों के किसी भी मिलान पैटर्न है $monthया "01। यदि यह किसी चीज से मेल नहीं खाता है, तो यह अकेला रह गया है।

यदि समापन ब्रैकेट के बाद अर्धविराम होता है, तो आपको इससे पहले स्थान की आवश्यकता नहीं है, क्योंकि अर्धविराम हमेशा एक अलग टोकन का हिस्सा होता है।

if [ "$month" = "01" ]; then

वही बैश के लिए जाता है (और ksh का और zsh का) डबल ब्रैकेट सिंटैक्स।

एक से अधिक हालत

शर्तों को संयोजित करने के दो तरीके हैं:

  1. अंदर [

  2. या [के साथ संयुक्त अलग आदेशों के साथ&&||

कोष्ठक के साथ समूहीकरण शायद भीतर आसान है [

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

पहले वाले से बचना चाहिए क्योंकि यह अविश्वसनीय है (उदाहरण के लिए प्रयास करें month='!')। पहले सुरक्षित स्ट्रिंग (यदि कोई है) का उपयोग करके अजीब चर सामग्री वाली समस्याओं से बचा जा सकता है; या का उपयोग करके [[/ के ]]बजाय [/ ]:

if [ "01" = "$month" -a "01" = "$day" ]

यदि हम दो स्थितियों का मिलान कैसे कर सकते हैं यदि, जैसे महीने का मूल्य == दिन का मान अगर [$ महीना = "01"] और& [$ दिन = "01"]; मैं उम्मीद कर रहा हूं कि 01 && 01 सच है, तो नीचे की स्थितियों को प्रिंट करें या किसी अन्य कथन पर जाएं
कुमार

@AshokSanganahalli मैंने अपना उत्तर बढ़ा दिया है।
हौके लैजिंग

1
[जब -a/ -oका उपयोग नहीं किया जाता है, तो हमेशा पॉसक आज्ञाकारी गोले के साथ विश्वसनीय होता है। -a/-oओवर का उपयोग करने में कोई फायदा नहीं है &&/||। मैं निश्चित रूप से इसके उपयोग को हतोत्साहित करूंगा। ध्यान दें कि [[POSIX नहीं है।
स्टीफन चेज़लस

4

इसे लिखने का दूसरा तरीका:

case $month:$day in
  (01:0[12])
    date="$last_month/$yes_day/$last_year"
    fulldate="$last_month/$yes_day/$last_year"
    ;;
  (*:0[12])
    date="$last_month/$yes_day/$year"
    fulldate="$year$last_month$yes_day"
    ;;
  (*)
    date="$month/$yes_day/$year"
    fulldate="$year$month$yes_day"
esac

1
caseकथन के लिए +1 । यदि आपके पास एक से अधिक हैं elif, तो आपको संभवतः उपयोग करना चाहिए case
हेलोसॉस्ट

-1

तो, यह आपका उत्तर है:

if [ $var1 == $var2 ];
 then
    echo "bla bla"
fi

तो आपको वर्ग ब्रैकेट और चर / मान के बीच "स्थान" डालना होगा।


नहीं, मुझे लगता है, क्योंकि जब मैंने स्क्रिप्ट को दो दिन पहले स्थानांतरित करने के लिए कहा था, जब स्क्रिप्ट वर्ष के दो दिन शुरू होती है और हर महीने के पहले और दूसरे दिन की भी जांच करती है और दो दिन पहले वापस ले जाती है, तो इसका मतलब है कि अगर [$ महीना = "01"] && [$ दिन = "01"] हमें लगता है कि हम महीने "01" से मैच करेंगे और पहले दिन "01" सही, तब तक चले जाएं या किसी और स्थिति में जाएं
कुमार

1
@AshokSanganahalli: मुझे नहीं पता कि यह कैसे संबंधित है, लेकिन आपकी IF स्थिति काम नहीं कर रही है क्योंकि आपके पास वर्ग कोष्ठक और मान के बीच "रिक्त स्थान" नहीं है
Neven

@AshokSanganahalli आमतौर पर आपके कौशल स्तर के लोगों के लिए यह एक अच्छा विचार नहीं है कि स्पष्ट रूप से बेहतर समझ के साथ लोगों को सुधारों का विवाद करने के लिए कम से कम संकेत देने की कोशिश करें। अगर आपके अनुमान सही होते तो आपको यहां नहीं पूछना पड़ता, क्या आप करते?
हौके लैजिंग

4
==मानक के बजाय गैर-उद्धृत चर और उपयोग के लिए -1 =
स्टीफन चेज़लस

2
प्रश्न टैग नहीं किया गया है। मानक [उर्फ testकमांड में समानता तुलना ऑपरेटर है =[यदि परीक्षणों के लिए, यह कोई असाइनमेंट नहीं करता है, तो इसे मना करने की कोई आवश्यकता नहीं है। कुछ [कार्यान्वयन ==मानक के विस्तार के रूप में समर्थन करते हैं , लेकिन सभी नहीं। बॉर्न शैल के, ashकी, poshके [एस या /bin/[उदाहरण के लिए कुछ सिस्टम की नहीं है। ==द्वारा जोड़ा गया था ksh, मुझे लगता है कि इसके नए (( ... ))निर्माण में एक ही ऑपरेटर के साथ स्थिरता है (जो = और == दोनों है, लेकिन इसका कोई मानक नहीं है)
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.