Estoy tratando de ejecutar el código a continuación, pero cuando trato de usar mi función en la instrucción if obtengo el -bash: [: too many argumentserror. Por que esta sucediendo?
¡Gracias de antemano!
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

Respuestas:
Cuando se usa
if [ ... ], en realidad está usando la[utilidad (que es igualtestpero requiere que el último argumento sea]).[no entiende ejecutar su función, espera cadenas. Afortunadamente, no es necesario utilizarlo[aquí (al menos para la función):Tenga en cuenta que también estoy comprobando el número entero primero, para que podamos evitar llamar a la función si
$docheckno es 1.Esto funciona porque
iftoma un comando arbitrario y decide qué hacer desde el estado de salida de ese comando. Aquí usamos una[ ... ]prueba junto con una llamada a su función, con&&un intermedio, creando un comando compuesto. El estado de salida del comando compuesto sería verdadero si tanto la[ ... ]prueba como la función devolvieran cero como sus estados de salida, indicando éxito.Como una nota de estilo, que no tendría la prueba de funcionamiento si la matriz no no contiene el elemento, pero si, si lo hace contener el elemento, y luego
Tener una prueba de función un lío voluntad negativa a la lógica en los casos en que se haga quiere probar si la matriz contiene el elemento (
if ! notContainsElement ...).fuente
tratar
-ala opción no es ni un shell ni unatestopciónaquí tienes una prueba de dos partes
luego vinculas al
ifusarcomo se señaló
-aes una opción de prueba, pero solo se puede usar con otra opción de prueba, por lo tanto, puede usarpara probar que
$aes inferior a ambos$by$c, pero no puede usar otro comando dentro del alcance de la prueba.fuente
-aes la opción de prueba , significa AND.$docheck, sin comillas$a/$b/ etc en el último ejemplo).Aquí hay una alternativa que a algunas personas puede no gustarles. Convierta su matriz de lista negra en una cadena y vea si la cadena con una fruta eliminada es la misma. Editado para rellenar las cadenas con espacios. Gracias a Scott por señalar el problema de la manzana / piña.
Creo que esto es más simple, pero carece de la lógica && que muchos prefieren.
fuente
listfrutas esté contenida dentro de una de lasblacklistfrutas. Por ejemplo, si cambiamosblacklista( "oranges" "pineapples" ), la salida de su script no cambia. ... (Continúa)&&? (3) Cuando publique el código, sangra correctamente.two wordsy dos elementos posteriores,twoywords. Y si su lista contenía*como una entrada, coincidiría con todo. (Y porque no se está citando el$fen lo que debería serecho "$f", si qué intenta hacer eco de un elemento tal, sería reemplazado con una lista de nombres de archivos en el directorio actual).