2008-10-08 17 views
13

मैं खोल में तार की तुलना करने की जरूरत है:मैं बोर्न शेल में तारों की तुलना कैसे करूं?

var1="mtu eth0" 

if [ "$var1" == "mtu *" ] 
then 
    # do something 
fi 

लेकिन स्पष्ट रूप से "*" शैल में काम नहीं करता। क्या इसे करने का कोई तरीका है?

उत्तर

11

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 " ] 
+0

'$ {var1: 0: 4}' - आपको उस वाक्यविन्यास कहां से मिला? यह निश्चित रूप से POSIX नहीं है। –

+1

कट का मेरा संस्करण कहता है कि पदों को 1 से शुरू किया जाता है। '' कट-सी 1-4'' या 'कट-सी -4'' सही मूल्य यहां वापस कर देता है। – jotr

18

यूनिक्स उपकरण का उपयोग करें। कार्यक्रम cut एक स्ट्रिंग को खुशी से छोटा कर देगा।

if [ "$(echo $var1 | cut -c 4)" = "mtu " ]; 

... जो भी आप चाहते हैं उसे करना चाहिए।

+1

हाँ, लेकिन थोड़े भारी –

+0

मेरा मानना ​​है कि चूंकि आप यहां दो तारों की तुलना कर रहे हैं, यह "=" या "==" होना चाहिए, न कि "-eq"। – William

+0

'' कट-सी 4' 'चौथे चरित्र में कटौती करता है:' कट-सी -4' 'पहले चार वर्णों में कटौती करता है। – jotr

0

या, = ~ ऑपरेटर का एक उदाहरण के रूप में:

if [[ "$var1" =~ "mtu *" ]] 
+0

वह किस प्रकार का खोल है? – ADEpt

+0

बैश 3.1 और अधिक में [[a = ~। *]] है। लेकिन * उद्धरण के अंदर 3.2 के लिए गलत है और दुकान के बिना अधिक compat31। – ephemient

+0

यह पॉज़िक्स नहीं है। –

6

आप बॉर्न शैल स्क्रिप्ट के भीतर से नियमित अभिव्यक्ति के खिलाफ मैच के लिए तार expr कॉल कर सकते हैं।

#!/bin/sh 

var1="mtu eth0" 

if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then 
    echo "match" 
fi 
3

मुझे क्या करना चाहते हैं निम्नलिखित:

# 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 
1

मैं तार की तुलना करने के मामले बयान का उपयोग करना चाहते नीचे काम करने के लिए लगता है।

एक तुच्छ उदाहरण है

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 

पागल कार्य कर लेते हैं और वह भी कुछ सीमाओं के साथ काम करता है,, फ़ाइलें एक जोड़ी से अधिक नहीं हो सकता है इस तरह के रूप मेगाबाइट्स और खोल को नल नहीं दिखता है, इसलिए यदि एक फ़ाइल नल से भरी हुई है और दूसरे में कोई नहीं है, (और न तो कुछ और है), तो इस परीक्षा में दोनों के बीच कोई अंतर नहीं दिखाई देगा।

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

1

बॉर्न शैल में, अगर मैं एक स्ट्रिंग एक और स्ट्रिंग है कि क्या जाँच करना चाहते हैं:

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 
संबंधित मुद्दे