Ich möchte gerne die echo
Befehl ausgeführt, wenn cat /etc/passwd | grep "sysa"
ist nicht wahr.
Was mache ich falsch?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
Ich möchte gerne die echo
Befehl ausgeführt, wenn cat /etc/passwd | grep "sysa"
ist nicht wahr.
Was mache ich falsch?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
Versuchen Sie
if ! grep -q sysa /etc/passwd ; then
grep
gibt zurück. true
wenn es das Suchziel findet, und false
wenn nicht.
Also NICHT falsch ( ! false
) == true
.
if
Die Auswertung in Shells ist sehr flexibel gestaltet und erfordert oft keine Befehlsketten (wie Sie geschrieben haben).
Wenn man sich Ihren Code so ansieht, ist die Verwendung der $( ... )
Form der cmd-Substitution ist lobenswert, aber denken Sie daran, was dabei herauskommt. Versuchen Sie echo $(cat /etc/passwd | grep "sysa")
um zu sehen, was ich meine. Sie können das weiter ausbauen, indem Sie die -c
(count) an grep an und machen dann if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
die zwar funktioniert, aber ziemlich altmodisch ist.
ABER, Sie könnten die neuesten Shell-Funktionen (arithmetische Auswertung) verwenden wie
if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
die Ihnen auch den Vorteil bietet, die auf C-Lang basierenden Vergleichsoperatoren zu verwenden, ==,<,>,>=,<=,%
und vielleicht noch ein paar andere.
In diesem Fall kann die arithmetische Auswertung gemäß einem Kommentar von Orwellophile noch weiter vereinfacht werden, etwa so
if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
OR
if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
Schließlich gibt es eine Auszeichnung genannt die Useless Use of Cat (UUOC)
. :-) Einige Leute werden aufspringen und Gothca schreien! Ich werde einfach sagen, dass grep
kann einen Dateinamen in der cmd-Zeile annehmen. Warum also zusätzliche Prozesse und Pipe-Konstruktionen aufrufen, wenn es nicht nötig ist? ;-)
Ich hoffe, das hilft.
Was mache ich falsch?
$(...)
hält die Wert und nicht den Exit-Status, weshalb dieser Ansatz falsch ist. In diesem speziellen Fall funktioniert er jedoch tatsächlich, weil sysa
wird gedruckt, wodurch die Testaussage wahr wird. Allerdings, if ! [ $(true) ]; then echo false; fi
würde immer drucken false
weil die true
Befehl schreibt nichts nach stdout (auch wenn der Exit-Code 0 ist). Deshalb muss er umformuliert werden in if ! grep ...; then
.
Eine Alternative wäre cat /etc/passwd | grep "sysa" || echo error
. Edit: Wie Alex schon sagte, Katze ist hier nutzlos : grep "sysa" /etc/passwd || echo error
.
Ich fand die anderen Antworten eher verwirrend, ich hoffe, das hilft jemandem.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.