[
आदेश एक साधारण आदेश है। यद्यपि अधिकांश गोले इसे दक्षता के लिए अंतर्निहित के रूप में प्रदान करते हैं, यह शेल के सामान्य वाक्यविन्यास नियमों का पालन करता है। [
इसके बिल्कुल बराबर है test
, सिवाय इसके कि इसके अंतिम तर्क की [
आवश्यकता है ]
और test
ऐसा नहीं है।
डबल ब्रैकेट [[ … ]]
विशेष वाक्यविन्यास हैं। उन्हें ksh (कई वर्षों बाद [
) में पेश किया गया था क्योंकि [
सही तरीके से उपयोग करने के लिए परेशानी हो सकती है और [[
कुछ नए अच्छे परिवर्धन की अनुमति देता है जो शेल विशेष वर्णों का उपयोग करते हैं। उदाहरण के लिए, आप लिख सकते हैं
[[ $x = foo && $y = bar ]]
क्योंकि पूरी सशर्त अभिव्यक्ति शेल द्वारा पार्स की गई है, जबकि [ $x = foo && $y = bar ]
पहले दो आदेशों में विभाजित हो जाएगी [ $x = foo
और ऑपरेटर $y = bar ]
द्वारा अलग हो जाएगी &&
। इसी तरह डबल ब्रैकेट पैटर्न मिलान वाक्यविन्यास जैसी चीजों को सक्षम करता है, उदाहरण के [[ $x == a* ]]
लिए यह परीक्षण करता है कि क्या मूल्य के x
साथ शुरू होता है a
; एकल ब्रैकेट में यह उन a*
फ़ाइलों की सूची में विस्तारित होगा, जिनके नाम a
वर्तमान निर्देशिका में शुरू होते हैं । डबल ब्रैकेट पहले ksh में पेश किए गए थे और केवल ksh, bash और zsh में उपलब्ध हैं।
एकल ब्रैकेट के अंदर, आपको अधिकांश अन्य स्थानों की तरह, चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करने की आवश्यकता होती है, क्योंकि वे केवल एक कमांड के लिए तर्क हैं (जो कमांड होता है [
)। डबल ब्रैकेट के अंदर, आपको डबल कोट्स की आवश्यकता नहीं है, क्योंकि शेल शब्द विभाजन या ग्लोबिंग नहीं करता है: यह एक सशर्त अभिव्यक्ति को पार्स कर रहा है, न कि एक कमांड।
एक अपवाद हालांकि [[ $var1 = "$var2" ]]
आप को बाइट-टू-बाइट स्ट्रिंग तुलना करना चाहते हैं, तो आपको उद्धरण चिह्नों की आवश्यकता है, अन्यथा, $var2
यह मैच के $var1
प्रति एक पैटर्न होगा ।
एक चीज जिसे आप नहीं कर सकते हैं वह [[ … ]]
ऑपरेटर के रूप में एक चर का उपयोग करता है। उदाहरण के लिए, यह पूरी तरह से कानूनी है (लेकिन शायद ही कभी उपयोगी):
if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …
अपने उदाहरण में
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …
अंदर आदेश if
है [
4 तर्क के साथ -d
, /home/mazimi/VirtualBox
, VMs
और ]
। शेल पार्स करता है -d /home/mazimi/VirtualBox
और फिर पता नहीं क्या करना है VMs
। आपको ${dir}
एक अच्छी तरह से गठित कमांड प्राप्त करने के लिए शब्द विभाजन को रोकने की आवश्यकता होगी ।
आम तौर पर बोलते हुए, हमेशा चर और कमांड प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें जब तक आप नहीं जानते कि आप परिणाम पर शब्द विभाजन और ग्लोबिंग करना चाहते हैं। मुख्य स्थान जहां यह सुरक्षित है कि दोहरे उद्धरण चिह्नों का उपयोग न करें:
- एक असाइनमेंट में:
foo=$bar
(लेकिन ध्यान दें कि आपको export "foo=$bar"
ऐरो असाइनमेंट में डबल कोट्स की आवश्यकता है जैसे array=("$a" "$b")
);
- एक में
case
बयान: case $foo in …
;
- डबल ब्रैकेट के अंदर
=
या ==
ऑपरेटर के दाहिने हाथ को छोड़कर (जब तक आप पैटर्न मिलान नहीं चाहते हैं) [[ $x = "$y" ]]
:।
इन सभी में, दोहरे उद्धरण चिह्नों का उपयोग करना सही है, इसलिए आप उन्नत नियमों को छोड़ सकते हैं और हर समय उद्धरणों का उपयोग कर सकते हैं।