जवाबों:
ज्यादातर मामलों में, [
एक शेल बिल्टिन है और इसके बराबर है 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
नहीं है[
।