खोज…


वाक्य - विन्यास

  • [[-ओपी $ फ़ाइलनाम]]
  • [[$ file1 -OP $ file2]]
  • [[-z $ स्ट्रिंग]]
  • [[-n $ स्ट्रिंग]]
  • [["$ string1" == "$ string2"]]
  • [["$ string1" == $ पैटर्न]]

टिप्पणियों

[[ … ]] सिंटैक्स, अंतर्निहित सशर्त अभिव्यक्तियों को बैश करता है। ध्यान दें कि कोष्ठक के दोनों ओर रिक्त स्थान आवश्यक हैं।

सशर्त अभिव्यक्तियाँ स्ट्रिंग्स, पूर्णांक और फ़ाइलों के गुणों का परीक्षण करने के लिए यूनिरी और बाइनरी ऑपरेटरों का उपयोग कर सकती हैं। वे तार्किक ऑपरेटरों का उपयोग भी कर सकते हैं && , || और !

फ़ाइल तुलना

if [[ $file1 -ef $file2 ]]; then
  echo "$file1 and $file2 are the same file"
fi

"एक ही फाइल" का मतलब है कि किसी एक फाइल को संशोधित करने से दूसरे पर असर पड़ता है। दो फाइलें समान हो सकती हैं, भले ही उनके अलग-अलग नाम हों, उदाहरण के लिए यदि वे हार्ड लिंक हैं, या यदि वे एक ही लक्ष्य के साथ प्रतीकात्मक लिंक हैं, या यदि एक दूसरे को इंगित करने वाला एक प्रतीकात्मक लिंक है।

यदि दो फ़ाइलों में समान सामग्री है, लेकिन वे अलग-अलग फाइलें हैं (ताकि एक को संशोधित करना दूसरे को प्रभावित न करें), तो -ef उन्हें अलग-अलग रिपोर्ट करता है। यदि आप दो फाइलों को बाइट द्वारा तुलना करना चाहते हैं, तो cmp उपयोगिता का उपयोग करें।

if cmp -s -- "$file1" "$file2"; then
  echo "$file1 and $file2 have identical contents"
else
  echo "$file1 and $file2 differ"
fi

पाठ फ़ाइलों के बीच मतभेद की एक मानव पठनीय सूची बनाने के लिए, का उपयोग diff उपयोगिता।

if diff -u "$file1" "$file2"; then
  echo "$file1 and $file2 have identical contents"
else
  : # the differences between the files have been listed
fi

फ़ाइल पहुँच परीक्षण

if [[ -r $filename ]]; then
  echo "$filename is a readable file"
fi
if [[ -w $filename ]]; then
  echo "$filename is a writable file"
fi
if [[ -x $filename ]]; then
  echo "$filename is an executable file"
fi

ये परीक्षण यह निर्धारित करने के लिए अनुमतियाँ और स्वामित्व लेते हैं कि क्या स्क्रिप्ट (या स्क्रिप्ट से लॉन्च किए गए प्रोग्राम) फ़ाइल तक पहुंच सकते हैं।

दौड़ की स्थितियों (TOCTOU) से सावधान रहें: सिर्फ इसलिए कि परीक्षण अब सफल हो गया है इसका मतलब यह नहीं है कि यह अगली पंक्ति में अभी भी मान्य है। आमतौर पर किसी फ़ाइल का उपयोग करने का प्रयास करना बेहतर होता है, और पहले परीक्षण के बजाय त्रुटि को संभालना है, और इस बीच फ़ाइल को बदलने की स्थिति में वैसे भी त्रुटि को संभालना होगा।

संख्यात्मक तुलना

संख्यात्मक तुलना -eq ऑपरेटरों और दोस्तों का उपयोग करती है

if [[ $num1 -eq $num2 ]]; then
  echo "$num1 == $num2"
fi
if [[ $num1 -le $num2 ]]; then
  echo "$num1 <= $num2"
fi

छह संख्यात्मक ऑपरेटर हैं:

  • -eq बराबर
  • -ne बराबर नहीं
  • -le कम या बराबर
  • -lt कम
  • -ge या बराबर होना
  • -gt अधिक हो

ध्यान दें कि < और > संचालक के अंदर [[ … ]] संख्याओं की तुलना करें, संख्याओं की नहीं।

if [[ 9 -lt 10 ]]; then
  echo "9 is before 10 in numeric order"
fi
if [[ 9 > 10 ]]; then
  echo "9 is after 10 in lexicographic order"
fi

दो पक्षों को दशमलव में लिखे गए अंक (या एक अग्रणी शून्य के साथ अष्टक) में होना चाहिए। वैकल्पिक रूप से, ((…)) अंकगणितीय अभिव्यक्ति वाक्य-विन्यास का उपयोग करें, जो C / Java /… -जैसे-वाक्यविन्यास में पूर्णांक गणना करता है।

x=2
if ((2*x == 4)); then
  echo "2 times 2 is 4"
fi
((x += 1))
echo "2 plus 1 is $x"

स्ट्रिंग तुलना और मिलान

स्ट्रिंग की तुलना उद्धृत स्ट्रिंग के बीच == ऑपरेटर का उपयोग करता है। != ऑपरेटर तुलना की उपेक्षा करता है।

if [[ "$string1" == "$string2" ]]; then
  echo "\$string1 and \$string2 are identical"
fi
if [[ "$string1" != "$string2" ]]; then
  echo "\$string1 and \$string2 are not identical"
fi

यदि दाईं ओर के भाग को उद्धृत नहीं किया जाता है, तो यह एक वाइल्डकार्ड पैटर्न है, जिसके मुकाबले $string1 का मिलान किया जाता है।

string='abc'
pattern1='a*'
pattern2='x*'
if [[ "$string" == $pattern1 ]]; then
  # the test is true
  echo "The string $string matches the pattern $pattern"
fi
if [[ "$string" != $pattern2 ]]; then
  # the test is false
  echo "The string $string does not match the pattern $pattern"
fi

< और > ऑपरेटर लेक्सिकोग्राफ़िक क्रम में स्ट्रिंग्स की तुलना करते हैं (स्ट्रिंग्स के लिए कोई कम-या-बराबर या अधिक-या-समान ऑपरेटर नहीं हैं)।

खाली स्ट्रिंग के लिए एकात्मक परीक्षण हैं।

if [[ -n "$string" ]]; then
  echo "$string is non-empty"
fi
if [[ -z "${string// }" ]]; then
  echo "$string is empty or contains only spaces"
fi
if [[ -z "$string" ]]; then
  echo "$string is empty"
fi

ऊपर, -z चेक का मतलब हो सकता है $string परेशान है, या यह एक खाली स्ट्रिंग पर सेट है। खाली और परेशान के बीच अंतर करने के लिए, उपयोग करें:

if [[ -n "${string+x}" ]]; then
    echo "$string is set, possibly to the empty string"
fi
if [[ -n "${string-x}" ]]; then
    echo "$string is either unset or set to a non-empty string"
fi
if [[ -z "${string+x}" ]]; then
    echo "$string is unset"
fi
if [[ -z "${string-x}" ]]; then
    echo "$string is set to an empty string"
fi

जहाँ x मनमाना है। या तालिका के रूप में :

                        +-------+-------+-----------+
            $string is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [[ -z ${string} ]]    | true  | true  | false     |
| [[ -z ${string+x} ]]  | true  | false | false     |
| [[ -z ${string-x} ]]  | false | true  | false     |
| [[ -n ${string} ]]    | false | false | true      |
| [[ -n ${string+x} ]]  | false | true  | true      |
| [[ -n ${string-x} ]]  | true  | false | true      |
+-----------------------+-------+-------+-----------+

वैकल्पिक रूप से , राज्य को केस स्टेटमेंट में जांचा जा सकता है:

case ${var+x$var} in
  (x) echo empty;;
  ("") echo unset;;
  (x*[![:blank:]]*) echo non-blank;;
  (*) echo blank
esac

जहां [:blank:] स्थानीय विशिष्ट क्षैतिज रिक्ति वर्ण (टैब, स्पेस, आदि) है।

फ़ाइल प्रकार परीक्षण

-e सशर्त ऑपरेटर परीक्षण करता है कि क्या कोई फ़ाइल मौजूद है (सभी फ़ाइल प्रकारों: निर्देशिकाओं आदि सहित)।

if [[ -e $filename ]]; then
  echo "$filename exists"
fi

विशिष्ट फ़ाइल प्रकारों के लिए भी परीक्षण हैं।

if [[ -f $filename ]]; then
  echo "$filename is a regular file"
elif [[ -d $filename ]]; then
  echo "$filename is a directory"
elif [[ -p $filename ]]; then
  echo "$filename is a named pipe"
elif [[ -S $filename ]]; then
  echo "$filename is a named socket"
elif [[ -b $filename ]]; then
  echo "$filename is a block device"
elif [[ -c $filename ]]; then
  echo "$filename is a character device"
fi
if [[ -L $filename ]]; then
  echo "$filename is a symbolic link (to any file type)"
fi

एक प्रतीकात्मक लिंक के लिए, -L अलावा, ये परीक्षण लक्ष्य पर लागू होते हैं, और टूटी हुई लिंक के लिए झूठे होते हैं।

if [[ -L $filename || -e $filename ]]; then
  echo "$filename exists (but may be a broken symbolic link)"
fi

if [[ -L $filename && ! -e $filename ]]; then
  echo "$filename is a broken symbolic link"
fi

एक कमांड के बाहर निकलने की स्थिति पर परीक्षण करें

स्थिति से बाहर निकलें 0: सफलता
0: विफलता के अलावा अन्य स्थिति से बाहर निकलें

कमांड की निकास स्थिति पर परीक्षण करने के लिए:

if command;then
    echo 'success'
else
    echo 'failure'
fi

एक लाइनर परीक्षण

आप इस तरह की चीजें कर सकते हैं:

[[ $s = 'something' ]] && echo 'matched' || echo "didn't match"
[[ $s == 'something' ]] && echo 'matched' || echo "didn't match"
[[ $s != 'something' ]] && echo "didn't match" || echo "matched"
[[ $s -eq 10 ]] && echo 'equal' || echo "not equal"
(( $s == 10 )) && echo 'equal' || echo 'not equal'

निकास स्थिति के लिए एक लाइनर परीक्षण:

command && echo 'exited with 0' || echo 'non 0 exit'
cmd && cmd1 && echo 'previous cmds were successful' || echo 'one of them failed'
cmd || cmd1 #If cmd fails try cmd1


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow