2008-10-08 9 views

Antwort

11

bash

Kürzeste fix:

if [[ "$var1" = "mtu "* ]] 

Bash [[ ]] nicht glob schäumten erhalten, im Gegensatz zu [ ] (die muss aus historischen Gründen).


bash --posix

Oh, habe ich geschrieben zu schnell. Bourne-Shell nicht heftiger Schlag ...

if [ "${var1:0:4}" == "mtu " ] 

${var1:0:4} bedeutet, dass die ersten vier Zeichen des $var1.


/bin/sh

Ah, sorry. Die POSIX-Emulation von Bash reicht nicht weit genug; Eine echte Original-Bourne-Shell hat ${var1:0:4} nicht. Sie werden etwas wie die Lösung von Mstrobl brauchen.

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ] 
+0

'$ {var1: 0: 4}' - wo hast du diese Syntax her? Es ist definitiv nicht POSIX. –

+1

Meine Version von cut besagt, dass die Positionen beginnend bei 1 nummeriert sind. "Cut -c 1-4" oder "cut -c -4" geben hier den korrekten Wert zurück. – jotr

18

Verwenden Sie die Unix-Tools. Das Programm verkürzt gerne eine Saite.

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

... sollte tun, was Sie wollen.

+1

ja, aber irgendwie schwer –

+0

Ich glaube, da du hier zwei Strings vergleichst, sollte es "=" oder "==", nicht "-eq" sein. – William

+0

'' cut -c 4'' schneidet das vierte Zeichen aus: 'cut -c -4'' schneidet die ersten vier Zeichen. – jotr

0

Oder als Beispiel für die = ~ Betreiber:

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

Welche Art von Shell ist das? – ADEpt

+0

Bash 3.1 und größer hat [[a = ~. *]]. Aber * innerhalb der Anführungszeichen ist falsch für 3.2 und höher ohne shopt -s compat31. – ephemient

+0

Es ist nicht POSIX. –

6

Sie können expr nennen Saiten gegen reguläre Ausdrücke aus Bourne-Shell-Skripten zu entsprechen. Das scheint unten zu arbeiten:

#!/bin/sh 

var1="mtu eth0" 

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

ich folgendes tun würde:

# Removes anything but first word from "var1" 
if [ "${var1%% *}" = "mtu" ] ; then ... fi 

Oder:

# Tries to remove the first word if it is "mtu", checks if we removed anything 
if [ "${var1#mtu }" != "$var1" ] ; then ... fi 
1

Ich mag die Case-Anweisung verwenden, Zeichenfolgen zu vergleichen.

Ein triviales Beispiel ist

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 

ich verrückte Dinge wie

case "$(cat file)" 
in 
    "$(cat other_file)") echo "file and other_file are the same" 
     ;; 
    *) echo "file and other_file are different" 
esac 

Und das funktioniert auch getan haben, mit einigen Einschränkungen, wie die Dateien nicht als ein paar mehr sein können Megabyte und die Shell sieht einfach keine Nullen. Wenn also eine Datei voll mit Nullen ist und die andere keine (und auch keine andere), wird dieser Test keinen Unterschied zwischen den beiden sehen.

Ich verwende den Dateivergleich nicht als ein ernstes Beispiel, nur ein Beispiel dafür, wie die case-Anweisung viel flexiblere Zeichenfolgenabgleiche ausführen kann als mit test oder expr oder ähnlichen Shell-Ausdrücken.

1

In Bourne-Shell, wenn ich, ob eine Zeichenfolge eines andere Zeichenfolge überprüfen möge enthält:

if [ `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then 

beilegen echo ${String} | grep -c ${Substr} mit zwei ` Backticks:

Um zu überprüfen, ob der Teil am Anfang oder am Ende:

if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then 
... 
if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then 
Verwandte Themen