Frage

Ich brauche Strings in der Schale vergleichen:

var1="mtu eth0"

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

Aber offensichtlich die "*" funktioniert nicht in Shell. Gibt es eine Möglichkeit, es zu tun?

War es hilfreich?

Lösung

bash

Kürzeste fix:

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

Bash [[ ]] nicht bekommen glob gedehnte, im Gegensatz zu [ ] (betragen, die man aus historischen Gründen).


bash --posix

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

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

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


/bin/sh

Ah, sorry. Bash POSIX-Emulation geht nicht weit genug; ein echtes Original-Bourne-Shell haben ${var1:0:4} nicht. Sie werden so etwas wie mstrobl-Lösung benötigen.

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

Andere Tipps

Mit den Unix-Tool. Das Programm cut wird gerne eine Zeichenfolge verkürzen.

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

... sollte das tun, was Sie wollen.

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

#!/bin/sh

var1="mtu eth0"

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

Ich würde folgendes tun:

# 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

In der Bourne-Shell, wenn ich will, um zu überprüfen, ob eine Zeichenfolge eine andere Zeichenfolge 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

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 habe verrückte Dinge getan 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 mit einigen Einschränkungen, wie die Dateien können nicht mehr sein als ein paar Megabyte und die Schale einfach Nullen nicht sehen, so dass, wenn eine Datei voller Nullen ist und der andere hat keine, ( und haben weder etwas anderes), dieser Test keinen Unterschied zwischen den beiden sehen.

ich als ein ernstes Beispiel nicht nur ein Beispiel dafür, wie der Case-Anweisung ist in der Lage zu tun, viel flexibler String-Matching als ist mit Test oder ausdr oder andere ähnliche Ausdrücke Shell verwenden, um die Datei-Vergleich.

Oder als Beispiel für die = ~ Betreiber:

if [[ "$var1" =~ "mtu *" ]]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top