J'essaie d'exécuter le code ci-dessous mais lorsque j'essaie d'utiliser ma fonction dans l'instruction if, j'obtiens l' -bash: [: too many arguments
erreur. Pourquoi cela se produit-il?
Merci d'avance!
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
Réponses:
Lorsque
if [ ... ]
vous utilisez, vous utilisez réellement l'[
utilitaire (qui est le même quetest
mais requiert que le dernier argument soit]
).[
ne comprend pas pour exécuter votre fonction, il attend des chaînes. Heureusement, vous n'avez pas besoin d'utiliser[
du tout ici (pour la fonction au moins):Notez que je vérifie également d'abord l'entier, afin que nous puissions éviter d'appeler la fonction du tout si ce
$docheck
n'est pas 1.Cela fonctionne car
if
prend une commande arbitraire et décide quoi faire à partir du statut de sortie de cette commande. Ici, nous utilisons un[ ... ]
test avec un appel à votre fonction, avec&&
entre les deux, la création d'une commande composée. L'état de sortie de la commande composée serait vrai si à la fois le[ ... ]
test et la fonction renvoyaient zéro comme état de sortie, signalant le succès.Comme une note de style, je n'aurais pas le test de fonctionnement si le tableau ne pas contenir l'élément , mais que si ne contient l'élément, puis
Avoir un test de fonctionnement un désordre négatif volonté de la logique dans le cas où vous ne voulez tester si le tableau contient l'élément (
if ! notContainsElement ...
).la source
essayer
-a
l'option n'est ni un shell ni unetest
optionici, vous avez un test en deux parties
vous liez ensuite en
if
utilisantcomme indiqué
-a
est une option de test, mais ne peut être utilisée qu'avec une autre option de test, vous pouvez donc utiliserpour tester qui
$a
est inférieur aux deux$b
et$c
, mais vous ne pouvez pas utiliser une autre commande dans la portée du test.la source
-a
est une option de test , cela signifie ET.$docheck
, non cité$a
/$b
/ etc dans le dernier exemple).Voici une alternative que certaines personnes pourraient ne pas aimer. Convertissez votre tableau de liste noire en chaîne et voyez si la chaîne avec un fruit supprimé est la même. Modifié pour remplir les chaînes avec des espaces. Merci à Scott d'avoir signalé le problème pomme / ananas.
Je pense que c'est plus simple, mais il manque la logique && que beaucoup préfèrent.
la source
list
fruits est contenu dans l' un desblacklist
fruits. Par exemple, si nous passonsblacklist
à( "oranges" "pineapples" )
, la sortie de votre script ne change pas. … (Suite)&&
? (3) Lorsque vous postez un code, veuillez le mettre en retrait de manière appropriée.two words
et deux éléments suivants,two
etwords
. Et si votre liste contenait*
une entrée, elle correspondrait à tout. (Et parce que vous n'êtes pas en train de citer le$f
dans ce qui devrait êtreecho "$f"
, si vous avez essayé de faire écho un tel élément, il serait remplacé par une liste de noms de fichiers dans le répertoire courant).