शेल स्क्रिप्ट में एक पंक्ति के अंत में अर्धवृत्त सुपरफुल है?


103

मेरे पास एक शेल स्क्रिप्ट है जिसमें निम्नलिखित शामिल हैं:

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

क्या सेमीकोलोन ऊपर के स्निपेट में पूरी तरह से कमतर हैं? और क्या कुछ लोगों के लिए डबल अर्धविराम का उपयोग करने का कोई कारण है?

ऐसा प्रतीत होता है कि अर्धविराम केवल एक विभाजक है, जिसे आप एक नई पंक्ति के बजाय उपयोग करेंगे।

जवाबों:


150

एक पंक्ति के अंत में एकल अर्धविराम अतिरेकपूर्ण होते हैं, क्योंकि न्यूलाइन एक कमांड विभाजक भी होता है। caseप्रत्येक पैटर्न ब्लॉक में अंतिम कमांड के अंत में विशेष रूप से डबल अर्धविराम की आवश्यकता होती है; देख help caseजानकारी के लिए।


20
महान! इसलिए, अगर मैं आपको सही तरीके से समझूं, तो मैं किसी भी लाइन के अंत में सुरक्षित रूप से किसी भी एकल अर्धविराम को हटा सकता हूं, लेकिन कभी भी डबल नहीं?
नागल

29

के अनुसार man bash:

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

तो, ;मेटाचैकर या कंट्रोल ऑपरेटर हो सकता है, जबकि ;;हमेशा कंट्रोल ऑपरेटर (केस कमांड में) होता है।

आपके विशेष कोड में, ;पंक्ति के अंत में सभी की आवश्यकता नहीं है। ;;लेकिन जरूरत है।


4
क्या के बीच व्यावहारिक अंतर है ;और ;;, तो? मैं BASH सिंटैक्स के साथ पर्याप्त रूप से परिचित नहीं हूँ, जो कि BASH को "मेटाचैचर" कहता है और जिसे "कंट्रोल ऑपरेटर" कहता है, के बीच के व्यावहारिक अंतर को जानने के लिए।
jvriesem

1
jvriesem के सवालों और टिप्पणियों से सहमत, डॉक्स स्निपेट थोड़ा संकीर्ण लगता है
'55 '

6

खोजने के विशेष मामले में, ;-exec द्वारा आह्वान किए गए आदेशों को समाप्त करने के लिए उपयोग किया जाता है। इस सवाल पर @kenorb का जवाब देखें ।


0

@ Opensourcebook-अमित

;टर्मिनल पर या शेल स्क्रिप्ट में सिंगल सेमीकोल के बराबर नईलाइन ।

नीचे दिए गए उदाहरण देखें:

टर्मिनल पर:

[root@server test]# ls;pwd;

शेल स्क्रिप्ट पर:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

लेकिन मैं उस टिप्पणी से सहमत नहीं हूं जो &न्यूलाइन या एकल अर्धविराम के बराबर है

& पृष्ठभूमि में कमांड कमांड भी चलाया जाता है लेकिन एक कमांड विभाजक लेकिन अर्धविराम या न्यूलाइन के रूप में काम नहीं किया जाता है।


-2

@ इग्नासियो वाज़केज़-अब्राम्स

वास्तव में यह पूरी तरह से सही नहीं है, एक पंक्ति के अंत में एकल अर्धविराम अतिरेकपूर्ण नहीं हैं और निश्चित रूप से नई रेखाओं के समान नहीं हैं।

से बैश संदर्भ मैनुअल

एक '' द्वारा अलग किए गए कमांड क्रमिक रूप से निष्पादित किया जाता है; शेल प्रत्येक कमांड के बदले में समाप्त होने का इंतजार करता है। वापसी की स्थिति निष्पादित अंतिम कमांड की निकास स्थिति है।

"नई लाइन" द्वारा अलग किए गए कमांड समानांतर में निष्पादित किए जा सकते हैं जब अर्धविराम द्वारा अलग किए गए कमांड हमेशा क्रमिक रूप से निष्पादित होते हैं


5
यह गलत है। इसमें कोई फर्क नही है। यदि आप मैन्युअल के एक ही खंड को ठीक से पढ़ते हैं, तो आप इसे देखेंगे, बस ऊपर कुछ पंक्तियाँ: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.तो आपने अर्धविराम के बारे में जो उद्धृत किया है वह समान रूप से नई सुर्खियों में लागू होता है।
अंडरस्कोर_ड

1
मैं मानता हूं कि यह वाक्य अस्पष्ट है, मुझे लगता है कि लेखक का मतलब क्या है ";" और "\ n" दोनों को एक से अधिक बार अलग-अलग कमांड के लिए इस्तेमाल किया जा सकता है लेकिन ऐसा नहीं है कि वे एक ही काम कर रहे हैं। मुझे यह लिंक मिला: unix.stackexchange.com/questions/53390/… मुझे यह भी नहीं पता था इससे पहले कि मुझे वास्तव में कुछ स्क्रिप्ट के साथ कोई समस्या थी जिसे मैंने लिखा था और "के बीच अंतर के बारे में नोट किया गया था;" और मेरे एक सहयोगी द्वारा "\ n"। दुर्भाग्य से, यह एक लंबे समय से पहले था और मुझे याद नहीं है कि यहां एक उदाहरण पोस्ट करना क्या था।
IJ

2
यदि आप @IJ से जुड़ी पोस्ट पढ़ेंगे तो आप देखेंगे कि समानतावाद &नहीं से आता है \n। एक टिप्पणी में यह कहा गया है कि वह अर्धविराम को छोड़ सकता है क्योंकि जाहिरा तौर पर, &जैसे ;और भी एक कमांड विभाजक है \n
मथायस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.