Shell-Skript kann eine Zeichenfolge unter einer if-Anweisung nicht analysieren

Shell-Skript kann eine Zeichenfolge unter einer if-Anweisung nicht analysieren

Ich habe ein einfaches Skript, in dem ich versuche herauszufinden, ob make some_target existiert oder nicht. Falls es nicht existiert, drucken Sie eine Anweisung und beenden Sie 1.

#!/bin/bash
set +ex
output=$(make -n some_target 2>&1 | head -1)
echo "$output"
if [ "$output" == "*No rule to make target*" ]; then
  echo "Target is not Present"
  exit 1
else
  echo "foo"  
fi

aber es wirft einen Fehler und geht in eine else-Schleife

make: *** No rule to make target 'some_target'.  Stop.
test.sh: 5: [: make: *** No rule to make target 'some_target'.  Stop.: unexpected operato                                                                                                  
foo

Antwort1

Ich konnte mit Folgendem eine Antwort finden:

#!/bin/sh
set +ex 
if make -n some_target 2>&1 | grep -m 1 "No rule to make target"; then
        echo "Target is not Present"
        exit 1
else
        echo "foo"
fi

Antwort2

Mustervergleich(*) ist möglich inbashlogische Operatoren ==, =, und !=wobei der Operand auf der rechten Seite als Muster betrachtet wird. Sie können Ihre Bedingung also wie folgt schreiben:

if [[ $output == *'No rule to make target'* ]]

um zu überprüfen, ob die Antwort enthält No rule to make target.

Allerdings könnte es effizienter sein, den Rückgabecode von make? zu überprüfen.

(*) Dies ist der gleiche grundlegende Mustervergleich wie bei Dateinamen. Es gibt auch einen logischen Operator, =~der einen regulären Ausdruck annimmt.

verwandte Informationen