आपने जो लिखा है वह वास्तव में लगभग काम करता है (यह काम करेगा यदि सभी चर संख्याएं थीं), लेकिन यह बिल्कुल भी एक मुहावरेदार तरीका नहीं है।
(…)
कोष्ठक एक उपधारा इंगित करता है । उनके अंदर जो है वह अन्य भाषाओं की तरह अभिव्यक्ति नहीं है। यह आदेशों की एक सूची है (बस कोष्ठकों के बाहर की तरह)। इन आदेशों को एक अलग उपप्रकार में निष्पादित किया जाता है, इसलिए कोष्ठक के अंदर किए गए किसी भी पुनर्निर्देशन, असाइनमेंट आदि का कोष्ठकों के बाहर कोई प्रभाव नहीं पड़ता है।
- एक प्रमुख डॉलर चिह्न के साथ,
$(…)
एक कमांड प्रतिस्थापन है : कोष्ठक के अंदर एक कमांड है, और कमांड से आउटपुट कमांड लाइन के हिस्से के रूप में उपयोग किया जाता है (अतिरिक्त विस्तार के बाद जब तक प्रतिस्थापन डबल कोट्स के बीच नहीं होता है, लेकिन यह एक और कहानी है ) ।
{ … }
ब्रेसिज़ कोष्ठक की तरह होते हैं, जिसमें वे समूह आदेश देते हैं, लेकिन वे केवल समूहन को प्रभावित करते हैं, समूहन को नहीं। कार्यक्रम x=2; { x=4; }; echo $x
4 प्रिंट करता है, जबकि x=2; (x=4); echo $x
प्रिंट 2। (इसके अलावा ब्रेसिज़ के लिए चारों ओर रिक्त स्थान की आवश्यकता होती है और समापन से पहले अर्धविराम होता है, जबकि यह नहीं है। यह सिर्फ एक सिंटैक्स क्वर्क है।)
((…))
डबल कोष्ठक एक अंकगणितीय अनुदेश को घेरता है, जो पूर्णांक पर एक संगणना है, जो कि अन्य प्रोग्रामिंग भाषाओं से मिलता जुलता है। इस सिंटैक्स का उपयोग ज्यादातर असाइनमेंट और सशर्त में किया जाता है।
- उसी सिंटैक्स का उपयोग अंकगणितीय अभिव्यक्तियों में किया जाता है
$((…))
, जो अभिव्यक्ति के पूर्णांक मान तक विस्तृत होता है।
[[ … ]]
डबल कोष्ठक सशर्त अभिव्यक्तियों को घेरते हैं । सशर्त अभिव्यक्तियों को ज्यादातर संचालकों पर बनाया जाता -n $variable
है जैसे परीक्षण करना कि क्या एक चर खाली है और -e $file
यदि कोई फ़ाइल मौजूद है तो परीक्षण करना है। स्ट्रिंग समानता ऑपरेटर भी हैं: "$string1" == "$string2"
(सावधान रहें कि दाहिने हाथ की ओर एक पैटर्न है, उदाहरण के लिए [[ $foo == a* ]]
परीक्षण जब $foo
शुरू होता है a
जबकि [[ $foo == "a*" ]]
परीक्षण $foo
बिल्कुल सही है a*
), और परिचित !
, &&
और ||
ऑपरेटरों के साथ-साथ समूहन के लिए नकारात्मकता, संयोजन और अव्यवस्था। ध्यान दें कि आपको प्रत्येक ऑपरेटर (जैसे [[ "$x" == "$y" ]]
, नहीं [[ "$x"=="$y" ]]
) के चारों ओर एक स्थान की आवश्यकता है , और एक स्थान या एक चरित्र जैसे ;
कोष्ठक के अंदर और बाहर दोनों (जैसे [[ -n $foo ]]
, नहीं[[-n $foo]]
)।
[ … ]
सिंगल ब्रैकेट अधिक quirks (लेकिन पुराने और अधिक पोर्टेबल) के साथ सशर्त अभिव्यक्तियों का एक वैकल्पिक रूप है। अब किसी के लिए मत लिखो; जब आप उन लिपियों को ढूंढना शुरू कर दें, जिनके बारे में उन्हें चिंता है।
यह अपने टेस्ट को बैश में लिखने का मुहावरेदार तरीका है:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
यदि आपको अन्य गोले के लिए पोर्टेबिलिटी की आवश्यकता है, तो यह तरीका होगा (प्रत्येक व्यक्ति परीक्षण के चारों ओर अतिरिक्त कोटिंग और ब्रैकेट के अलग-अलग सेट पर ध्यान दें, और =
ksh / bash / zsh ==
संस्करण के बजाय पारंपरिक ऑपरेटर का उपयोग करें ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then