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 arguments
error. 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 igualtest
pero 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
$docheck
no es 1.Esto funciona porque
if
toma 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
-a
la opción no es ni un shell ni unatest
opciónaquí tienes una prueba de dos partes
luego vinculas al
if
usarcomo se señaló
-a
es una opción de prueba, pero solo se puede usar con otra opción de prueba, por lo tanto, puede usarpara probar que
$a
es inferior a ambos$b
y$c
, pero no puede usar otro comando dentro del alcance de la prueba.fuente
-a
es 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
list
frutas esté contenida dentro de una de lasblacklist
frutas. Por ejemplo, si cambiamosblacklist
a( "oranges" "pineapples" )
, la salida de su script no cambia. ... (Continúa)&&
? (3) Cuando publique el código, sangra correctamente.two words
y dos elementos posteriores,two
ywords
. Y si su lista contenía*
como una entrada, coincidiría con todo. (Y porque no se está citando el$f
en 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).