Ich wollte nur fragen, ob es einen Befehl gibt, der für gängige Muscheln (Bash, Dash, Kornshell) funktioniert. Es soll prüfen, ob die line
Variable einen Teil des Pfades enthält.
if [[ $line =~ "$PWD"$ ]] ;then
Ich wollte nur fragen, ob es einen Befehl gibt, der für gängige Muscheln (Bash, Dash, Kornshell) funktioniert. Es soll prüfen, ob die line
Variable einen Teil des Pfades enthält.
if [[ $line =~ "$PWD"$ ]] ;then
Antworten:
Ja, neuere Versionen von bash können dies:
$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes
Die gleiche Syntax funktioniert in zsh und ksh, jedoch nicht in Bindestrich. Soweit ich weiß, hat dash keine solchen Fähigkeiten.
Beachten Sie, dass Ihre Regex , ob die Variable prüft $line
Enden mit $PWD
. Entfernen Sie $PWD
Folgendes $line
, um zu überprüfen, ob irgendwo Übereinstimmungen vorhanden sind $
:
$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes
/home/terdon/foo
mit zsh
, ksh
und bash
(4.3.25) , und es hat gut funktioniert mit allen von ihnen. Es bricht tatsächlich ab, wenn es PWD
Regex-Operatoren enthält. Das war mir einfach nie in den Sinn gekommen, danke!
In jeder POSIX-kompatiblen Shell können Sie Folgendes tun:
case $line in (*"$PWD"*)
# whatever your then block had
;;esac
Dies funktioniert in bash
, dash
und fast jeder anderen Shell, die Sie benennen können.
Es kann auch verwendet werden, um mehrere Möglichkeiten einfach zu handhaben. Zum Beispiel:
case $line in
(*"$PWD"*)
echo \$PWD match\!
;;
(*"$OLDPWD"*)
echo \$OLDPWD match\!
;;
(*)
! echo no match\!
;;esac
Sie können auch alternieren:
case $line in (*"$PWD"*|*"$OLDPWD"*)
echo '$OLDPWD|$PWD match!'
;;esac
Beachten Sie die Verwendung des obigen Zitats:
case $line ...
case
Anweisung wird weder aufgeteilt $IFS
noch als Muster für den Dateinamen gen verwendet. Dies ähnelt der Art und Weise, wie das linke Argument in einem [[
Test behandelt wird.(*"$PWD"*)
$IFS
Dateinamen- noch einer Dateinamengenerierung unterzogen - eine nicht zitierte Erweiterung wird weder geteilt noch global.$PWD
ein *
und enthalten ist und nicht in Anführungszeichen steht, wird es als Musterobjekt und nicht als *
zu durchsuchendes Literal ausgelegt .:
Kommentar war verwirrend, aber ich habe es , weil es nicht gen einen Syntaxfehler hat oder versehentlich etwas proggie läuft namens was auch immer in $PATH
. Auf diese Weise entsteht immer noch ein Syntaxfehler, aber zumindest ist klar, dass dies der Fall sein sollte.
(
case $line in *"$PWD"*)
zsh
würgst du daran.
$(case a in a);; esac)
?
zsh -cx '(case $1 in $2*) echo ok;;esac)' -- one o
funktioniert, aber das Präfix a : $
bricht es. Ich denke, das ist das Problem, auf das ich in der Vergangenheit gestoßen bin - es war immer ein wenig unklar, und ich habe es nie zu genau betrachtet, weil das Hinzufügen ganz links es (
immer behoben hat. Schließlich schrieb ich es einfach als eine seltsame zsh
Sache ab und machte es zur Regel, beide Enden zu verwenden.