वर्ग ब्रैकेट निष्पादन योग्य का उद्देश्य क्या है


जवाबों:


33

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

5
@AlexandruIrimiea तुम्हारा क्या मतलब है? एक शेल जिसमें [बिलिन नहीं होता है वह सिर्फ एक शेल होता है जिसके लेखक ने एक को जोड़ने का फैसला नहीं किया है। उदाहरण के लिए एक बेसिन tcsh नहीं है[
terdon

7
@AlexandruIrimiea वे "कस्टम" गोले नहीं हैं। यह सिर्फ इतना bashहै कि कई कार्यक्रमों (गोले) में से एक है जो समान कार्य करने के लिए डिज़ाइन किए गए हैं। बैश सबसे लोकप्रिय लेकिन कई सिस्टम अलग डिफ़ॉल्ट गोले के साथ जहाज है। बेहतर ज्ञात लोगों में से कुछ हैं sh, bash, zsh, dash, ksh, tcsh, cshऔर fish। आप लोगों के साथ अपने सिस्टम पर उपलब्ध देख सकते हैं cat /etc/shellsऔर एक आंशिक सूची यहाँ
terdon

1
@ JörgWMittag सच में? मुझे पता था कि उबंटू है sh, dashलेकिन मुझे लगा कि बचाव प्रणाली /bin/shव्यस्त बॉक्स का उपयोग नहीं करती है। क्या आपको यकीन है?
terdon

2
हालाँकि, वास्तव में इनट्रामाफ़्स में एक व्यस्त बॉक्स है, जैसा कि इस सवाल
सर्गी कोलोडियाज़नी

1
@AlexandruIrimiea, इस बारे में कि कौन सी आज्ञाओं का निर्माण करना आवश्यक है और किन कमांडों का निर्माण किया जा सकता है या नहीं किया जा सकता है, इस पोस्ट को देखें ।
वाइल्डकार्ड

12

इसका उपयोग शेल स्क्रिप्ट में कंडीशन टेस्टिंग के लिए किया जाता है। इस कार्यक्रम का एक और नाम है test:

if [ 1 -lt 2 ]; then ...

यह शेल व्याकरण जैसा दिखता है, लेकिन ऐसा नहीं है। आमतौर [पर एक शेल बिल्डिन होता है, लेकिन संभवत: यह एक बाहरी कमांड के रूप में मौजूद है।

ब्लॉक "CONDITIONAL EXPRESSIONS" देखें man bash


1
इसे भी देखें: unix.stackexchange.com/questions/224616/…
dr01

9

[के रूप में एक ही आदेश है 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 वे समान नहीं हैं (जो भी हो)।
हौके लैजिंग

मैं बाइट तुलना का मतलब यह नहीं था। कुछ * निक्स में वे बाइट स्तर में भी समान हैं = जुड़े हुए हैं।
पॉज़िक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.