Wie kann ich Strings in Bourne Shell vergleichen?
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?
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 *" ]]