==
ऑपरेटर खोल स्क्रिप्ट में दो स्ट्रिंग तुलना करने के लिए प्रयोग किया जाता है। हालांकि, मैं मामले की अनदेखी करने वाले दो तारों की तुलना करना चाहता हूं, यह कैसे किया जा सकता है? क्या इसके लिए कोई मानक आदेश है?
==
ऑपरेटर खोल स्क्रिप्ट में दो स्ट्रिंग तुलना करने के लिए प्रयोग किया जाता है। हालांकि, मैं मामले की अनदेखी करने वाले दो तारों की तुलना करना चाहता हूं, यह कैसे किया जा सकता है? क्या इसके लिए कोई मानक आदेश है?
जवाबों:
अगर आपके पास बैश है
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
अन्यथा, आपको हमें यह बताना चाहिए कि आप किस शेल का उपयोग कर रहे हैं।
वैकल्पिक, awk का उपयोग करना
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
दो तारों की तुलना करने के लिए उपयोग किया जाता है, लेकिन प्रतिक्रिया एक case
बयान का उपयोग करके मामले-असंवेदनशील तुलना को प्रदर्शित करती है । आश्वासन देते हुए, shopt
समाधान भी केस-संवेदी के उपयोग में सक्षम बनाता है ==
, =~
अन्य स्ट्रिंग तुलना ऑपरेटर, और।
shopt -u nocasematch
बैश के डिफॉल्ट को वापस करने के लिए तुलना किए जाने के बाद निष्पादित करने के लिए संभवतः बुद्धिमान ।
nocasematch
सेटिंग को सहेजने और पुनर्स्थापित करने के लिए सबसे अच्छा है । साथ यह पकड़ो SHELLNOCASEMATCH=`shopt -p nocasematch`
तो साथ इसे बदलने shopt -s nocasematch
और एक बार किया, साथ इसे फिर से स्थापित$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
क्योंकि shopt -p
विकल्प सेट नहीं होने पर कोड 1 के साथ बाहर निकल जाएगा, और इससे स्क्रिप्ट set -e
प्रभाव में आ सकती है।
बैश में, आप किसी स्ट्रिंग को सभी लोअर / अपर-केस में संशोधित करने के लिए पैरामीटर विस्तार का उपयोग कर सकते हैं:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
कथन परिणाम में है:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
लागू किया जाता है, लेकिन आमतौर पर ऐसे "भाषा-स्तर" समाधान इसे सही ढंग से संभालते हैं।
ये सभी उत्तर ऐसा करने के सबसे आसान और त्वरित तरीके को अनदेखा करते हैं (जब तक आपके पास बैश 4 है):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
आप जो कुछ भी कर रहे हैं, वह परिणामों को कम करने और तुलना करने के लिए दोनों तारों को परिवर्तित कर रहा है।
Nocasematch की स्थिति को बचाएं (यदि कोई अन्य कार्य अक्षम होने के आधार पर है):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
नोट: local
यदि यह किसी फ़ंक्शन के अंदर है तो ही उपयोग करें ।
case
स्टेटमेंट (उन में घोस्टडॉग के जवाब सहित) हमेशा मेरी त्वचा को क्रॉल बना देंगे
एक तरीका यह होगा कि दोनों तारों को ऊपरी या निचले हिस्से में बदला जाए:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Grep का उपयोग करने का एक और तरीका होगा:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
अल्पाइन (जो प्रदान करता है के आधार पर मेरे डोकर-ized अनुप्रयोगों में विधि sh
के माध्यम से busybox
)। धन्यवाद।
कोर्न शेल के लिए, मैं टाइपसेट बिल्ट-इन कमांड (लो-केस के लिए -l और अपर-केस के लिए -u) का उपयोग करता हूं।
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
बहुत आसान है अगर आप केस-असंवेदनशील लाइन की तुलना करने के लिए fgrep करते हैं:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
के लिए zsh
वाक्य रचना थोड़ा अलग है, लेकिन अभी भी यहाँ सबसे जवाब तुलना में कम है:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
यह तुलना करने से पहले दोनों तारों को अपरकेस में बदल देगा।
एक अन्य विधि का उपयोग करता है zsh है globbing flags
, जो हमें सीधे i
ग्लोब ध्वज का उपयोग करके केस-असंवेदनशील मिलान का उपयोग करने की अनुमति देता है :
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
मैं इस महान ब्लॉग / ट्यूटोरियल / जो भी मामला संवेदनशील पैटर्न से निपटने के बारे में आया था । निम्नलिखित तीन विधियों को उदाहरणों के साथ विवरण में समझाया गया है:
1. tr कमांड का उपयोग करके पैटर्न को लोअरकेस में बदलें
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. केस पैटर्न के साथ रेगेक्स का उपयोग करें
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. nocasematch चालू करें
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
if
बयानों का उपयोग करते हुए तार की तुलना करने वाले किसी के लिए ,shopt
दृष्टिकोण को सिंगल-ब्रैकेट[[ ]]
फॉर्म के बजाय सशर्त के डबल-ब्रैकेट फॉर्म का उपयोग करने की आवश्यकता होती है[ ]
। यह भी देखें: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html