त्रिगुट ऑपरेटर दुरुपयोग, ((test)) && cmd1 || cmd2
या [ test ] && cmd1 || cmd2
, जितना संभव हो उतना।
उदाहरण (लंबाई की गिनती हमेशा शीर्ष पंक्ति को बाहर करती है):
t="$something"
if [ $t == "hi" ];then
cmd1
cmd2
elif [ $t == "bye" ];then
cmd3
cmd4
else
cmd5
if [ $t == "sup" ];then
cmd6
fi
fi
केवल टर्नरी ऑपरेटरों का उपयोग करके, इसे आसानी से छोटा किया जा सकता है:
t="$something"
[ $t == "hi" ]&&{
cmd1;cmd2
}||[ $t == "bye" ]&&{
cmd3;cmd4
}||{
cmd5
[ $t == "sup" ]&&cmd6
}
जैसा कि nyuszika7h ने टिप्पणियों में बताया है, इस विशिष्ट उदाहरण को आगे भी उपयोग करके छोटा किया जा सकता है case
:
t="$something"
case $t in "hi")cmd1;cmd2;;"bye")cmd3;cmd4;;*)cmd5;[ $t == "sup" ]&&cmd6;esac
इसके अलावा, जहां तक संभव हो ब्रेसिज़ के लिए कोष्ठकों को प्राथमिकता दें। चूंकि कोष्ठक एक मेटाचैकर है, और एक शब्द नहीं है, इसलिए उन्हें कभी भी किसी भी संदर्भ में रिक्त स्थान की आवश्यकता नहीं होती है। यह भी संभव के रूप में एक subshell में के रूप में कई आदेशों को चलाने, क्योंकि घुंघराले ब्रेसिज़ (यानी इसका मतलब है {
और }
) शब्द, नहीं मेटा-वर्ण आरक्षित हैं, और इस तरह सही ढंग से पार्स करने के लिए दोनों पक्षों पर खाली स्थान के संबंध के लिए है, लेकिन मेटा-वर्ण नहीं है। मुझे लगता है कि आप अब तक जानते हैं कि उपधाराएं मूल वातावरण को प्रभावित नहीं करती हैं, इसलिए यह मानते हुए कि सभी उदाहरण कमांड सुरक्षित रूप से एक उपधारा में चलाए जा सकते हैं (जो किसी भी मामले में विशिष्ट नहीं है), आप उपरोक्त कोड को छोटा कर सकते हैं :
t=$something
[ $t == "hi" ]&&(cmd1;cmd2)||[ $t == "bye" ]&&(cmd3;cmd4)||(cmd5;[ $t == "sup" ]&&cmd6)
इसके अलावा, यदि आप नहीं कर सकते हैं, तो कोष्ठक का उपयोग करना अभी भी कुछ को छोटा कर सकता है। एक बात का ध्यान रखें कि यह केवल पूर्णांकों के लिए काम करता है, जो इस उदाहरण के उद्देश्यों के लिए इसे बेकार कर देता है (लेकिन -eq
पूर्णांक के लिए उपयोग करने से बेहतर है )।
एक और बात, जहाँ संभव हो, उद्धरणों से बचें। उस उपरोक्त सलाह का उपयोग करते हुए, आप इसे और छोटा कर सकते हैं। उदाहरण:
t=$something
[ $t == hi ]&&(cmd1;cmd2)||[ $t == bye ]&&(cmd3;cmd4)||(cmd5;[ $t == sup ]&&cmd6)
परीक्षण स्थितियों में, एकल ब्रैकेट को कुछ अपवादों के साथ जितना संभव हो सके डबल ब्रैकेट के लिए प्राथमिकता दें। यह दो पात्रों को मुफ्त में छोड़ देता है, लेकिन यह कुछ मामलों में उतना मजबूत नहीं है (यह एक बैश एक्सटेंशन है - उदाहरण के लिए नीचे देखें)। इसके अलावा, डबल के बजाय एकल बराबर तर्क का उपयोग करें। यह एक स्वतंत्र चरित्र है।
[[ $f == b ]]&&: # ... <-- Bad
[ $f == b ]&&: # ... <-- Better
[ $f = b ]&&: # ... <-- Best. word splits and pathname-expands the contents of $f. Esp. bad if it starts with -
इस चेतावनी पर ध्यान दें, विशेष रूप से अशक्त आउटपुट या अपरिभाषित चर के लिए जाँच में:
[[ $f ]]&&: # double quotes aren't needed inside [[, which can save chars
[ "$f" = '' ]&&: <-- This is significantly longer
[ -n "$f" ]&&:
सभी तकनीकी में, यह विशिष्ट उदाहरण सबसे अच्छा होगा case
... in
:
t=$something
case $t in hi)cmd1;cmd2;;bye)cmd3;cmd4;;*)cmd5;[ $t == sup ]&&cmd6;esac
पुनश्च: संदर्भ की परवाह किए बिना बैश में मान्यता प्राप्त मेटा-पात्रों की एक सूची यहां दी गई है (और शब्दों को अलग कर सकते हैं):
संपादित करें: जैसा कि मैनटवर्क ने बताया है, डबल कोष्ठक परीक्षण केवल पूर्णांकों के लिए काम करता है। इसके अलावा, अप्रत्यक्ष रूप से, मैंने पाया कि आपको ==
ऑपरेटर के आसपास व्हाट्सएप रखने की आवश्यकता है । ऊपर मेरी पोस्ट को ठीक किया।
मैं भी प्रत्येक सेगमेंट की लंबाई पुनर्गणना करने के लिए बहुत आलसी था, इसलिए मैंने उन्हें हटा दिया। यदि आवश्यक हो तो एक स्ट्रिंग लंबाई कैलकुलेटर ऑनलाइन खोजना आसान होना चाहिए।
sh
और यह शेल किसfor
सिंटैक्स की अनुमति देता है ? इसे स्पष्ट रूप से अनुमति दी गई हैzsh
।