Ich möchte ein Unix-Shell-Skript schreiben, das verschiedene Logikfunktionen ausführt, wenn sich eine Zeichenfolge in einer anderen Zeichenfolge befindet. Wenn ich mich beispielsweise in einem bestimmten Ordner befinde, verzweigen Sie. Könnte mir bitte jemand sagen, wie das geht? Wenn möglich, möchte ich dies nicht Shell-spezifisch machen (dh nicht nur Bash), aber wenn es keinen anderen Weg gibt, kann ich damit auskommen.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
CURRENT_DIR
ist redundant; Sie können nur verwenden$PWD
.Antworten:
Hier ist noch eine andere Lösung. Dies verwendet die Erweiterung der POSIX-Teilzeichenfolgenparameter und funktioniert daher in Bash, Dash, KornShell (ksh), Z-Shell (zsh) usw.
Eine funktionalisierte Version mit einigen Beispielen:
quelle
substring="$( printf '%q' "$2" )"
rettet den Tag.[[ $haystack == *"My needle"* ]]
[]
. Siehe meine Antwort stackoverflow.com/a/54490453/712666 .Reine POSIX-Shell:
Erweiterte Shells wie ksh oder bash haben ausgefallene Matching-Mechanismen, aber der alte Stil
case
ist überraschend mächtig.quelle
Leider ist mir kein Weg bekannt, dies in sh zu tun. Mit bash (ab Version 3.0.0, was wahrscheinlich das ist, was Sie haben) können Sie den Operator = ~ jedoch wie folgt verwenden:
Als zusätzlichen Bonus (und / oder als Warnung, wenn Ihre Zeichenfolgen lustige Zeichen enthalten) akzeptiert = ~ reguläre Ausdrücke als richtigen Operanden, wenn Sie die Anführungszeichen weglassen.
quelle
[[ test =~ "test.*" ]]
vs.[[ test =~ test.* ]]
.quelle
grep -q "$2"
zugrep -q "$2" > /dev/null
, um unerwünschte Ausgaben zu vermeiden.Hier finden Sie einen Link zu verschiedenen Lösungen Ihres Problems.
Dies ist mein Favorit, da es am menschlichsten lesbar ist:
Die Star Wildcard-Methode
quelle
sh
erhielt ich damit "unbekannten Operanden". Funktioniert aber mit Bash.[[
ist nicht POSIXquelle
Es gibt reguläre Bash-Ausdrücke . Oder es gibt 'Ausdruck':
quelle
-> Ausgabe: String 1 enthält String 2
quelle
Auf der Manpage finden Sie das Testprogramm. Wenn Sie nur die Existenz eines Verzeichnisses testen, tun Sie normalerweise Folgendes:
Wenn Sie tatsächlich versuchen, eine Zeichenfolge abzugleichen, können Sie auch Bash-Erweiterungsregeln und Platzhalter verwenden:
Wenn Sie etwas komplexeres tun müssen, müssen Sie ein anderes Programm wie expr verwenden.
quelle
In besonderen Fällen, in denen Sie herausfinden möchten, ob ein Wort in einem Langtext enthalten ist, können Sie den Langtext mit einer Schleife durchlaufen.
Dies ist reine Bourne-Shell.
quelle
Wenn Sie eine Nur- Ksh- Methode wünschen , die so schnell wie "Test" ist, können Sie Folgendes tun:
Es funktioniert, indem die Nadel im Heuhaufen gelöscht und dann die Saitenlänge von alten und neuen Heuhaufen verglichen wird.
quelle
test
? Wie inreturn [ ${#haystack} -eq ${#1} ]
?