मैं खोल में तार की तुलना करने की जरूरत है:मैं बोर्न शेल में तारों की तुलना कैसे करूं?
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
लेकिन स्पष्ट रूप से "*" शैल में काम नहीं करता। क्या इसे करने का कोई तरीका है?
मैं खोल में तार की तुलना करने की जरूरत है:मैं बोर्न शेल में तारों की तुलना कैसे करूं?
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
लेकिन स्पष्ट रूप से "*" शैल में काम नहीं करता। क्या इसे करने का कोई तरीका है?
bash
सबसे छोटा ठीक:
if [[ "$var1" = "mtu "* ]]
बैश के [[ ]]
, ग्लोब-विस्तार नहीं मिलता है [ ]
के विपरीत (जो चाहिए, ऐतिहासिक कारणों से)।
bash --posix
ओह, मैं बहुत तेजी से तैनात। बॉर्न शैल, नहीं बैश ...
if [ "${var1:0:4}" == "mtu " ]
${var1:0:4}
$var1
के पहले चार वर्णों का मतलब है।
/bin/sh
आह, माफ करना। बैश का पॉज़िक्स इम्यूलेशन काफी दूर नहीं जाता है; एक वास्तविक मूल बोर्न शेल में ${var1:0:4}
नहीं है। आपको mstrobl के समाधान की तरह कुछ चाहिए।
if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]
यूनिक्स उपकरण का उपयोग करें। कार्यक्रम cut
एक स्ट्रिंग को खुशी से छोटा कर देगा।
if [ "$(echo $var1 | cut -c 4)" = "mtu " ];
... जो भी आप चाहते हैं उसे करना चाहिए।
आप बॉर्न शैल स्क्रिप्ट के भीतर से नियमित अभिव्यक्ति के खिलाफ मैच के लिए तार expr
कॉल कर सकते हैं।
#!/bin/sh
var1="mtu eth0"
if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
echo "match"
fi
मुझे क्या करना चाहते हैं निम्नलिखित:
# Removes anything but first word from "var1"
if [ "${var1%% *}" = "mtu" ] ; then ... fi
या:
# Tries to remove the first word if it is "mtu", checks if we removed anything
if [ "${var1#mtu }" != "$var1" ] ; then ... fi
मैं तार की तुलना करने के मामले बयान का उपयोग करना चाहते नीचे काम करने के लिए लगता है।
एक तुच्छ उदाहरण है
case "$input"
in
"$variable1") echo "matched the first value"
;;
"$variable2") echo "matched the second value"
;;
*[a-z]*) echo "input has letters"
;;
'') echo "input is null!"
;;
*[0-9]*) echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)"
;;
*) echo "Some wacky stuff in the input!"
esac
मैं की तरह
case "$(cat file)"
in
"$(cat other_file)") echo "file and other_file are the same"
;;
*) echo "file and other_file are different"
esac
पागल कार्य कर लेते हैं और वह भी कुछ सीमाओं के साथ काम करता है,, फ़ाइलें एक जोड़ी से अधिक नहीं हो सकता है इस तरह के रूप मेगाबाइट्स और खोल को नल नहीं दिखता है, इसलिए यदि एक फ़ाइल नल से भरी हुई है और दूसरे में कोई नहीं है, (और न तो कुछ और है), तो इस परीक्षा में दोनों के बीच कोई अंतर नहीं दिखाई देगा।
मैं फ़ाइल-तुलना को गंभीर उदाहरण के रूप में उपयोग नहीं करता हूं, केवल उदाहरण का उदाहरण है कि केस स्टेटमेंट परीक्षण या एक्सप्रप्र या अन्य समान शैल अभिव्यक्तियों के मुकाबले अधिक लचीली स्ट्रिंग मिलान करने में सक्षम है।
बॉर्न शैल में, अगर मैं एक स्ट्रिंग एक और स्ट्रिंग है कि क्या जाँच करना चाहते हैं:
if [ `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then
दो `
बैकटिक साथ संलग्न करें echo ${String} | grep -c ${Substr}
:
जानने के लिए कि सबस्ट्रिंग शुरुआत में या कम से है अंत:
if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then
...
if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then
'$ {var1: 0: 4}' - आपको उस वाक्यविन्यास कहां से मिला? यह निश्चित रूप से POSIX नहीं है। –
कट का मेरा संस्करण कहता है कि पदों को 1 से शुरू किया जाता है। '' कट-सी 1-4'' या 'कट-सी -4'' सही मूल्य यहां वापस कर देता है। – jotr