Wie vergleiche ich eine Variable mit einer Zeichenfolge (und mache etwas, wenn sie übereinstimmen)?
Wie vergleiche ich eine Variable mit einer Zeichenfolge (und mache etwas, wenn sie übereinstimmen)?
Antworten:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Wenn Sie etwas tun möchten, wenn es nicht übereinstimmt, ersetzen Sie es =
durch !=
. Weitere Informationen zu Zeichenfolgenoperationen und arithmetischen Operationen finden Sie in der jeweiligen Dokumentation.
$x
?Sie möchten die Anführungszeichen verwenden $x
, da Ihr Bash-Skript, wenn es leer ist, auf einen Syntaxfehler stößt, wie unten dargestellt:
if [ = "valid" ]; then
==
BedienersBeachten Sie, dass Bash ==
für die Gleichstellung mit verwendet werden [
kann, dies ist jedoch kein Standard .
Verwenden Sie entweder den ersten Fall, in dem die Anführungszeichen $x
optional sind:
if [[ "$x" == "valid" ]]; then
oder verwenden Sie den zweiten Fall:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Durch Ändern von ["$ 1" = "on"] wurde das Problem behoben.
=
und nicht zwei haben.
[ $x -eq "valid" ]
. -eq
ist der Vergleichsoperator für Ganzzahlen, nicht für Zeichenfolgen.
["x$yes" == "xyes"]
, bei dem sowohl der Variablen als auch dem Zeichenfolgenliteral ein vorangestellt wird x
? Ist das ein Relikt aus alten Zeiten oder wird es in manchen Situationen wirklich gebraucht?
Oder wenn Sie keine else-Klausel benötigen:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
dies fehlschlagen kann.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
ist effizienter als ( echo invalid && false )
, da keine unnötige Subshell bezahlt werden muss.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Anmerkungen:
if
und [
und ]
sind wichtig>
und <
sind Umleitungsoperatoren so entkommen sie mit \>
und \<
jeweils für Streicher.$a
tatsächlich " "
als Teil des String-Literalwerts umgeben war, daher musste ich das Escape-Zeichen verwenden $b
, um die Werte zu vergleichen. Ich konnte dies nach dem Ausführen feststellen bash -x ./script.sh
. Mit dem Flag -x können Sie den Wert jeder Ausführung anzeigen und beim Debuggen helfen.
Verwenden Sie zum Vergleichen von Zeichenfolgen mit Platzhaltern
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
Platzhalter. (Übrigens: +1 für Platzhalter!)
$stringB
muss angegeben werden (und im Übrigen muss die linke Seite nicht angegeben werden) : if [[ $stringA = *"$stringB"* ]]; then
.
Ich muss einem der Kommentare in einem Punkt widersprechen:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Es sieht nur so aus, als würde man, hmm, den Uneingeweihten ...
In gewisser Weise werden gemeinsame Muster als Sprache verwendet.
Und nachdem du die Sprache gelernt hast.
Es ist ein einfacher logischer Ausdruck mit einem besonderen Teil: der verzögerten Auswertung der Logikoperatoren.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Jeder Teil ist ein logischer Ausdruck; Das erste kann wahr oder falsch sein, die anderen beiden sind immer wahr.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Wenn es nun ausgewertet wird, wird das erste geprüft. Wenn es falsch ist, ist der zweite Operand der Logik und &&
danach nicht relevant. Das erste ist nicht wahr, also kann es sowieso nicht das erste und das zweite wahr sein.
Nun, in diesem Fall ist die erste Seite der Logik oder ||
falsch, aber es könnte wahr sein, wenn die andere Seite - der dritte Teil - wahr ist.
Daher wird der dritte Teil bewertet - hauptsächlich das Schreiben der Nachricht als Nebeneffekt. (Es hat das Ergebnis 0
für wahr, das wir hier nicht verwenden)
Die anderen Fälle sind ähnlich, aber einfacher - und - das verspreche ich! sind - können - leicht zu lesen sein!
(Ich habe keine, aber ich denke, ein UNIX-Veteran mit grauem Bart zu sein, hilft dabei sehr.)
... && ... || ...
ist normalerweise verpönt (sorry, Unix-Veteran mit grauem Bart, Sie haben sich die ganze Zeit geirrt), da es semantisch nicht äquivalent zu ist if ... then ... else ...
. Keine Sorge, dies ist eine häufige Gefahr .
... && ... || ...
ist ein vollkommen gültiges Muster und eine gängige Bash-Sprache. Die Verwendung setzt Vorkenntnisse voraus (was gut zu beachten ist, wenn Anfänger im Publikum sind), aber OP hat die Haare, um zu beweisen, dass sie wissen, wie man offene Schachtabdeckungen vermeidet.
Sie können auch Use Case / Esac verwenden
case "$string" in
"$pattern" ) echo "found";;
esac
|
, vor dem trennen können )
. Die in
Anweisung entspricht then
in if
Anweisungen. Sie könnten argumentieren, dass es über eine Liste von Mustern funktioniert, wobei jede Liste ihre eigene Erklärung hat, was zu tun ist, wenn Sie aus Python stammen. Nicht wie substring in string
, sondern for item in list
. Verwenden Sie a *
als letzte Anweisung, wenn Sie eine else
Bedingung wünschen . Es kehrt bei der ersten Begegnung zurück.
Das folgende Skript liest zeilenweise aus einer Datei mit dem Namen "testonthis" und vergleicht dann jede Zeile mit einer einfachen Zeichenfolge, einer Zeichenfolge mit Sonderzeichen und einem regulären Ausdruck. Wenn es nicht übereinstimmt, druckt das Skript die Zeile, andernfalls nicht.
Platz in Bash ist so wichtig. Also wird folgendes funktionieren:
[ "$LINE" != "table_name" ]
Aber das wird nicht:
["$LINE" != "table_name"]
Verwenden Sie also bitte unverändert:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
sondern weil [
es sich tatsächlich um eine externe Binärdatei handelt (wie in which [
ergibt so etwas wie /usr/bin/[
)
Ich würde wahrscheinlich Regexp-Übereinstimmungen verwenden, wenn die Eingabe nur wenige gültige Einträge enthält. ZB sind nur "Start" und "Stopp" gültige Aktionen.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Beachten Sie, dass ich die Variable $ACTION
mit Doppelkommas in Kleinbuchstaben schreibe. Beachten Sie auch, dass dies bei zu alten Bash-Versionen nicht funktioniert.
Bash 4+ Beispiele. Hinweis: Wenn Sie keine Anführungszeichen verwenden, treten Probleme auf, wenn Wörter Leerzeichen usw. enthalten. Zitieren Sie immer in Bash, IMO.
Hier sind einige Beispiele in Bash 4+:
Beispiel 1: Überprüfen Sie die Zeichenfolge auf "Ja" (Groß- und Kleinschreibung wird nicht berücksichtigt):
if [[ "${str,,}" == *"yes"* ]] ;then
Beispiel 2: Überprüfen Sie die Zeichenfolge auf "Ja" (Groß- und Kleinschreibung wird nicht berücksichtigt):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Beispiel 3: Überprüfen Sie die Zeichenfolge auf "Ja" (Groß- und Kleinschreibung beachten):
if [[ "${str}" == *"yes"* ]] ;then
Beispiel 4: Überprüfen Sie die Zeichenfolge auf "Ja" (Groß- und Kleinschreibung beachten):
if [[ "${str}" =~ "yes" ]] ;then
Beispiel 5, genaue Übereinstimmung (Groß- und Kleinschreibung beachten):
if [[ "${str}" == "yes" ]] ;then
Beispiel 6, genaue Übereinstimmung (ohne Berücksichtigung der Groß- und Kleinschreibung):
if [[ "${str,,}" == "yes" ]] ;then
Beispiel 7, genaue Übereinstimmung:
if [ "$a" = "$b" ] ;then
Genießen.
if [ "$a"="$b" ]
oder es funktioniert nicht ... kann keine Leerzeichen um das Gleiche haben
Ich habe es auf diese Weise gemacht, die mit Bash und Dash (sh) kompatibel ist :
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
(
Nichtverwendung?