संपादित करें: यह एक और अधिक पूर्ण संस्करण है जो [
(उर्फ test
) और (के बीच अंतर ) दिखाता है [[
।
निम्न तालिका से पता चलता है कि एक चर का उद्धरण दिया गया है या नहीं, चाहे आप एकल या डबल कोष्ठक का उपयोग करते हैं और क्या चर में केवल एक स्थान होता है जो -n/-z
एक चर को जांचने के लिए उपयुक्त है या नहीं इसके साथ एक परीक्षण का उपयोग करने वाली चीजें प्रभावित होती हैं ।
| 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b
| [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"
-----+------------------------------------+------------------------------------
unset| false false true false true true | false false false false true true
null | false false true false true true | false false false false true true
space| false true true true true false| true true true true false false
zero | true true true true false false| true true true true false false
digit| true true true true false false| true true true true false false
char | true true true true false false| true true true true false false
hyphn| true true true true false false| true true true true false false
two | -err- true -err- true -err- false| true true true true false false
part | -err- true -err- true -err- false| true true true true false false
Tstr | true true -err- true -err- false| true true true true false false
Fsym | false true -err- true -err- false| true true true true false false
T= | true true -err- true -err- false| true true true true false false
F= | false true -err- true -err- false| true true true true false false
T!= | true true -err- true -err- false| true true true true false false
F!= | false true -err- true -err- false| true true true true false false
Teq | true true -err- true -err- false| true true true true false false
Feq | false true -err- true -err- false| true true true true false false
Tne | true true -err- true -err- false| true true true true false false
Fne | false true -err- true -err- false| true true true true false false
यदि आप जानना चाहते हैं कि एक चर गैर-शून्य लंबाई है, तो निम्न में से कोई एक कार्य करें:
- एकल कोष्ठक (कॉलम 2a) में चर को कोट करें
-n
एकल कोष्ठक (स्तंभ 4 ए) में चर का उपयोग और उद्धरण करें
- डबल कोष्ठक के साथ या बिना उद्धरण के साथ या उसके बिना
-n
(कॉलम 1 बी - 4 बी) का उपयोग करें
कॉलम 1 ए में सूचना "दो" लेबल वाली पंक्ति पर शुरू हो रही है जो परिणाम इंगित करता है कि चर [
की सामग्री का मूल्यांकन कर रहा है जैसे कि वे सशर्त अभिव्यक्ति का हिस्सा थे (परिणाम "टी" या "एफ" द्वारा निहित दावे से मेल खाता है विवरण कॉलम)। जब [[
उपयोग किया जाता है (कॉलम 1 बी), चर सामग्री को एक स्ट्रिंग के रूप में देखा जाता है और मूल्यांकन नहीं किया जाता है।
कॉलम 3 ए और 5 ए में त्रुटियां इस तथ्य के कारण होती हैं कि चर मूल्य में एक स्थान शामिल है और चर अयोग्य है। फिर से, जैसा कि कॉलम 3 बी और 5 बी में दिखाया गया है, [[
एक स्ट्रिंग के रूप में चर की सामग्री का मूल्यांकन करता है।
इसके विपरीत, शून्य-लंबाई के स्ट्रिंग्स के लिए परीक्षण के लिए, कॉलम 6 ए, 5 बी और 6 बी ऐसा करने के सही तरीके दिखाते हैं। यह भी ध्यान दें कि यदि विपरीत ऑपरेशन का उपयोग करने की तुलना में नकारात्मक इरादे स्पष्ट हैं, तो इनमें से किसी भी परीक्षण को नकार दिया जा सकता है। उदाहरण के लिए if ! [[ -n $var ]]
:।
यदि आप उपयोग कर रहे हैं [
, तो यह सुनिश्चित करने की कुंजी कि आपको अप्रत्याशित परिणाम नहीं मिल रहा है, चर को उद्धृत कर रहा है। का उपयोग करना [[
, यह कोई फर्क नहीं पड़ता।
त्रुटि संदेश, जिसे दबाया जा रहा है, "यूनीरी ऑपरेटर अपेक्षित" या "बाइनरी ऑपरेटर अपेक्षित" हैं।
यह वह लिपि है जिसने ऊपर तालिका का निर्माण किया।
#!/bin/bash
# by Dennis Williamson
# 2010-10-06, revised 2010-11-10
# for http://stackoverflow.com/q/3869072
# designed to fit an 80 character terminal
dw=5 # description column width
w=6 # table column width
t () { printf '%-*s' "$w" " true"; }
f () { [[ $? == 1 ]] && printf '%-*s' "$w" " false" || printf '%-*s' "$w" " -err-"; }
o=/dev/null
echo ' | 1a 2a 3a 4a 5a 6a | 1b 2b 3b 4b 5b 6b'
echo ' | [ [" [-n [-n" [-z [-z" | [[ [[" [[-n [[-n" [[-z [[-z"'
echo '-----+------------------------------------+------------------------------------'
while read -r d t
do
printf '%-*s|' "$dw" "$d"
case $d in
unset) unset t ;;
space) t=' ' ;;
esac
[ $t ] 2>$o && t || f
[ "$t" ] && t || f
[ -n $t ] 2>$o && t || f
[ -n "$t" ] && t || f
[ -z $t ] 2>$o && t || f
[ -z "$t" ] && t || f
echo -n "|"
[[ $t ]] && t || f
[[ "$t" ]] && t || f
[[ -n $t ]] && t || f
[[ -n "$t" ]] && t || f
[[ -z $t ]] && t || f
[[ -z "$t" ]] && t || f
echo
done <<'EOF'
unset
null
space
zero 0
digit 1
char c
hyphn -z
two a b
part a -a
Tstr -n a
Fsym -h .
T= 1 = 1
F= 1 = 2
T!= 1 != 2
F!= 1 != 1
Teq 1 -eq 1
Feq 1 -eq 2
Tne 1 -ne 2
Fne 1 -ne 1
EOF