जवाबों:
ज्यादातर मामलों में, [एक शेल बिल्टिन है और इसके बराबर है test। हालाँकि, जैसे test, यह एक स्वसंपूर्ण निष्पादन के रूप में भी मौजूद है: यह /bin/[आपने देखा। आप इसे type -a [(आर्क लिनक्स सिस्टम पर, रनिंग के साथ bash) टेस्ट कर सकते हैं :
$ type -a [
[ is a shell builtin
[ is /bin/[
इसलिए, मेरे सिस्टम पर, मेरे पास दो हैं [: मेरे शेल का बिलिन और निष्पादन योग्य /bin। निष्पादन योग्य में प्रलेखित है man test:
TEST(1) User Commands TEST(1)
NAME
test - check file types and compare values
SYNOPSIS
test EXPRESSION
test
[ EXPRESSION ]
[ ]
[ OPTION
DESCRIPTION
Exit with the status determined by EXPRESSION.
[ ... ]
जैसा कि आप ऊपर उद्धृत मैन पेज के अंश में देख सकते हैं, testऔर [समतुल्य हैं। /bin/[और /bin/testआदेशों रहे POSIX द्वारा निर्दिष्ट है, जिसके कारण आप उन्हें सच है कि कई गोले भी builtins के रूप में उन्हें प्रदान के बावजूद मिल जाएगा। उनकी उपस्थिति यह सुनिश्चित करती है कि निर्माण जैसे:
[ "$var" -gt 10 ] && echo yes
यहां तक कि अगर काम चल रहा है, तो शेल में एक [बिलिन नहीं होगा । उदाहरण के लिए tcsh:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
bashहै कि कई कार्यक्रमों (गोले) में से एक है जो समान कार्य करने के लिए डिज़ाइन किए गए हैं। बैश सबसे लोकप्रिय लेकिन कई सिस्टम अलग डिफ़ॉल्ट गोले के साथ जहाज है। बेहतर ज्ञात लोगों में से कुछ हैं sh, bash, zsh, dash, ksh, tcsh, cshऔर fish। आप लोगों के साथ अपने सिस्टम पर उपलब्ध देख सकते हैं cat /etc/shellsऔर एक आंशिक सूची यहाँ ।
sh, dashलेकिन मुझे लगा कि बचाव प्रणाली /bin/shव्यस्त बॉक्स का उपयोग नहीं करती है। क्या आपको यकीन है?
इसका उपयोग शेल स्क्रिप्ट में कंडीशन टेस्टिंग के लिए किया जाता है। इस कार्यक्रम का एक और नाम है test:
if [ 1 -lt 2 ]; then ...
यह शेल व्याकरण जैसा दिखता है, लेकिन ऐसा नहीं है। आमतौर [पर एक शेल बिल्डिन होता है, लेकिन संभवत: यह एक बाहरी कमांड के रूप में मौजूद है।
ब्लॉक "CONDITIONAL EXPRESSIONS" देखें man bash।
[के रूप में एक ही आदेश है test। कुछ * nix सिस्टम पर, एक दूसरे के लिए एक लिंक है। उदाहरण के लिए, यदि आप चलाते हैं:
strings /usr/bin/test
strings /usr/bin/[
आपको वही आउटपुट दिखाई देगा।
अधिकांश श-शेल / पॉज़िक्स-शेल में बिलिन [और testकमांड शामिल हैं। उसी के लिए सच है echo। /bin/echoअधिकांश गोले में एक कमांड और एक बिलिन दोनों है । यही कारण है कि कभी-कभी आपको लगता है कि उदाहरण के लिए, echoविभिन्न प्रणालियों पर एक ही तरह से काम नहीं करता है।
testया [केवल एक से बाहर निकलें कोड की वापसी 0या 1। यदि परीक्षण सफल रहा, तो निकास कोड 0 है।
# you can use [ command but last argument must be ]
# = inside joke for programmers
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write
# [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2 && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no
आप इसके [साथ भी उपयोग कर सकते हैं if:
if [ -f file.txt ] ; then
echo "file exists"
else
echo "file does not exist"
fi
# is the same as
if test -f file.txt ; then
echo "file exists"
else
echo "file does not exist"
fi
लेकिन आप ifहर कमांड के साथ उपयोग कर सकते हैं , ifएक्जिट कोड के परीक्षण के लिए है। उदाहरण के लिए:
cp x y 2>/dev/null && echo cp x y OK || echo cp x y not OK
या, का उपयोग कर if:
if cp x y 2>/dev/null ; then
echo cp x y OK
else
echo cp x y not OK
fi
आप testएक्ज़िट कोड का परीक्षण करने के लिए केवल कमांड का उपयोग करके एक ही परिणाम प्राप्त कर सकते हैं जो चर में सहेजा गया है stat:
cp x y 2>/dev/null
stat=$?
if test "$stat" = 0 ; then
echo cp x y OK
else
echo cp x y not OK
fi
आप परीक्षण के लिए [[ ]]और उपयोग भी कर सकते हैं (( )), लेकिन वे लगभग समान सिंटैक्स होने के बावजूद समान नहीं हैं [और test:
अंत में, यह जानने के लिए कि एक कमांड क्या है, आप इसका उपयोग कर सकते हैं:
type -a command
cmp /usr/bin/[ /usr/bin/testया शायद हैश का उपयोग करना चाहिए, sha256sum /usr/bin/[ /usr/bin/testलेकिन नहीं strings। मेरे सिस्टम पर (OpenSUSE Tumbleweed) BTW वे समान नहीं हैं (जो भी हो)।
[बिलिन नहीं होता है वह सिर्फ एक शेल होता है जिसके लेखक ने एक को जोड़ने का फैसला नहीं किया है। उदाहरण के लिए एक बेसिनtcshनहीं है[।