Der Grep-Exit-Status wurde mit Pipe und Variable nicht erfolgreich getestet

1321
uldics

Ich brauche einen möglichst kurzen Bash-Testbefehl (Bracket-Test), um das Ergebnis des Pipe-grep mit Variable als Suchargument auszuwerten. Ich teste, ob sich eine neue Zeichenfolge im Array befindet - den Array-Inhalt als Zeilen an grep weiterleiten und den Exit-Code überprüfen. Aber irgendwie klappt es nicht. Findet den Wert im Array nicht. Ich habe auf verschiedene Weise Klammern, Klammern, Anführungszeichen, Semikolons ohne Glück versucht. Was ist hier falsch?

#! /bin/bash startLineNrs=(); startLineNrs+=("45"); startLineNrs+=("280"); startLineNrs+=("80"); startLineNr="280"; echo "\$startLineNrs:" ${#startLineNrs[@]}; printf '%s\n' "$"; [ "$(printf '%s\n' $ | grep -xq $)" ] && { echo $?; echo Found ;} || { echo $?; echo Not found ;} 

Grundsätzlich möchte ich verstehen, ob ... dann im Vergleich zum Brackets-Test. Die if ... then Methode funktioniert:

if !( printf '%s\n' "$" | grep -xq "$" ); then startLineNrs+=("$startLineNr") ; fi 
4
Zu Ihrer Information, "$?" Gibt nur den letzten Exit-Status der Pipe zurück. Wenn Sie eine längere Pipe-Reihe haben, möchten Sie vielleicht $ PIPESTATUS Xen2050 vor 6 Jahren 1

2 Antworten auf die Frage

3
John1024

Versuchen Sie Folgendes, damit der Befehl &&- ||funktioniert:

printf '%s\n' $ | grep -xq $ && { echo $?; echo Found ;} || { echo $?; echo Not found ;} 

Anmerkungen:

  1. Der Testbefehl ( [) und der Befehlersetzung ( $(...)) werden nicht benötigt.

  2. Eine Subtilität des Konstrukts a && b || cist, dass ces nicht nur ausgeführt wird, wenn ein aFehler auftritt, sondern auch, wenn ein bFehler auftritt. Da Sie baus echoAnweisungen bestehen, die normalerweise erfolgreich sein sollten, sollte dies normalerweise kein Problem sein.

  3. Weitere Methoden zum Testen der Array-Mitgliedschaft finden Sie unter "Prüfen, ob ein Bash-Array einen Wert enthält" .

2
codeforester

Die korrekte Schreibweise für Ihre if-Anweisung lautet:

if printf '%s\n' "$" | grep -xq "$startLineNr"; then # your logic fi 

Das Problem mit Ihrer Testanweisung [...]ist das [oder testbehandelt sie "$(printf '%s\n' $ | grep -xq $)als Zeichenfolge, und es wird nicht als Befehlsersetzung ausgeführt. Da es sich um eine nicht leere Zeichenfolge handelt, wird sie immer als wahr ausgewertet.