Bash
सशर्त अभिव्यक्तियाँ
खोज…
वाक्य - विन्यास
- [[-ओपी $ फ़ाइलनाम]]
- [[$ 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