
In meinem Playbook sollte die folgende Zeile zurückgeben 1
, und wenn sie zurückgibt >1
, sollte die Wiedergabe gestoppt werden:
shell: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; echo $?
Mein Spiel ist tatsächlich mit diesem Fehler fehlgeschlagen:
"msg": "There is more than one /opt/tomcat/apache-tomcat-8.x.xx instance on server01, ending play"
Nach dem erneuten Ausführen im Debugmodus sehe ich, dass dieser Shellbefehl in der Debugausgabe folgendermaßen dargestellt wird:
"cmd": "ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?",
Im obigen Beispiel werden doppelte Anführungszeichen mit \
Zeichen maskiert. Die Frage ist, welcher Befehl tatsächlich verwendet wird – der im Playbook oder der, den wir in der Debug-Ausgabe sehen?
Denn wenn ich den Befehl ausführe, der im Notebook steht, also ohne Escapezeichen, ist die Ausgabe 1
wie erwartet:
[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep "[ ]\\+apache-tomcat-8.5.69$"; echo $?
1
Wenn ich jedoch den Befehl eingebe, der sich in der Debug-Ausgabe befindet, erhalte ich Folgendes:
[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?
grep: Invalid regular expression
2
Irgendwelche Ideen, wie man das lösen kann?
Antwort1
VerwendeneinzelAnführungszeichen im grep
Befehl.
grep "[ ]\+{{ newTomcatVer }}$"
Wenn Sie doppelte Anführungszeichen verwenden, versucht die Shell, Variablen zu erweitern, d. h. sie versucht, einen Sinn daraus zu ziehen $"
. Dies kommt daher, $\"
dass die Shell es nicht $"
als Parameter erkennt, den sie erweitern kann. Sie versucht also zu erraten, was Sie wollten und überspringt das Anführungszeichen.
Es gibt keinen wirklichen Grund, hier eine Shell-Parametererweiterung durchzuführen, daher können Sie den regulären Ausdruck in einfache Anführungszeichen setzen, um das Problem zu lösen. Die Shell wird keine Parametererweiterung durchführen und den $
Ausdruck wörtlich behandeln.
grep '[ ]\+{{ newTomcatVer }}$'