Ich versuche, den folgenden Code auszuführen, aber wenn ich versuche, meine Funktion in der if-Anweisung zu verwenden, wird der -bash: [: too many arguments
Fehler angezeigt. Warum passiert es?
Vielen Dank im Voraus!
notContainsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 1; done
return 0
}
list=( "pears" "apples" "bananas" "oranges" )
blacklist=( "oranges" "apples" )
docheck=1
for fruit in "${list[@]}"
do
if [ notContainsElement "$fruit" "${blacklist[@]}" -a $docheck = 1 ]
then
echo $fruit
fi
done
Antworten:
Bei der Verwendung verwenden
if [ ... ]
Sie tatsächlich das[
Dienstprogramm (das das gleiche ist,test
aber erfordert, dass das letzte Argument lautet]
).[
versteht es nicht, Ihre Funktion auszuführen, es erwartet Zeichenfolgen. Zum Glück müssen Sie hier überhaupt nicht verwenden[
(zumindest für die Funktion):Beachten Sie, dass ich auch zuerst die Ganzzahl überprüfe, damit wir die Funktion möglicherweise überhaupt
$docheck
nicht aufrufen, wenn sie nicht 1 ist.Dies funktioniert, weil
if
ein beliebiger Befehl verwendet wird und aus dem Beendigungsstatus dieses Befehls entschieden wird, was zu tun ist. Hier verwenden wir einen[ ... ]
Test zusammen mit einem Aufruf Ihrer Funktion, wobei&&
dazwischen ein zusammengesetzter Befehl erstellt wird. Der Exit-Status des zusammengesetzten Befehls wäre wahr, wenn sowohl der[ ... ]
Test als auch die Funktion als Exit-Status Null zurückgeben würden, was den Erfolg signalisiert.Als Stilnotiz würde ich den Funktionstest nicht durchführen lassen, ob das Array das Element nicht enthält, sondern ob es das Element enthält, und dann
Einen Funktionstest negativ Willen vermasseln Logik in den Fällen , in Erwägung , wo Sie tun testen wollen , ob das Array das Element enthält (
if ! notContainsElement ...
).quelle
Versuchen
-a
Option ist weder eine Shell noch einetest
OptionHier haben Sie einen zweiteiligen Test
Sie verknüpfen dann
if
mitWie bereits erwähnt,
-a
handelt es sich um eine Testoption, die jedoch nur mit anderen Testoptionen verwendet werden kann. Sie können sie daher verwenden, der Test
$a
ist niedriger als beide$b
und$c
, aber man kann nicht einen anderen Befehl innerhalb Prüfumfang verwendet.quelle
-a
ist Test - Option, es bedeutet und.$docheck
, nicht zitiert$a
/$b
/ etc im letzten Beispiel).Hier ist eine Alternative, die manche Leute vielleicht nicht mögen. Konvertieren Sie Ihr Blacklist-Array in eine Zeichenfolge und prüfen Sie, ob die Zeichenfolge mit der entfernten Frucht identisch ist. Bearbeitet, um die Zeichenfolgen mit Leerzeichen aufzufüllen. Vielen Dank an Scott für den Hinweis auf das Apfel- / Ananasproblem.
Ich denke, das ist einfacher, aber es fehlt die && Logik, die viele bevorzugen.
quelle
list
Früchte in einer derblacklist
Früchte enthalten ist. Wenn wir beispielsweise zu wechselnblacklist
, ändert sich( "oranges" "pineapples" )
die Ausgabe Ihres Skripts nicht. … (Fortsetzung)&&
? (3) Wenn Sie eine Postleitzahl eingeben, rücken Sie diese bitte entsprechend ein.two words
und zwei nachfolgenden Elemententwo
und unterscheidenwords
. Und wenn Ihre Liste*
als Eintrag enthalten wäre, würde sie zu allem passen. (Und weil Sie nicht das zitieren$f
in dem, was sein sollteecho "$f"
, wenn Sie haben ein solches Element Echo versuchen, wäre es mit einer Liste von Dateinamen im aktuellen Verzeichnis ersetzt werden).