2017-09-15 5 views
1

Avec le code suivant, je souhaite vérifier chaque index dans un tableau pour une valeur nulle, une chaîne vide ou une chaîne contenant uniquement un espace blanc. Cependant, cela ne fonctionne pas.Bash - Vérification de chaque index d'un tableau pour les valeurs vides

test=("apple" "orange" " ") 
for i in ${test[@]}; 
do 
    if [ -z "$i" ]; then 
     echo "Oh no!" 
    fi 
done 

Il ne pénètre jamais dans le bloc if. Qu'est-ce que je fais mal?

+1

Un espace est pas vide, vous devez également citer '$ {Test [@]}' car il bande actuellement des valeurs et espaces blancs vides – 123

Répondre

1

Vous avez quelques erreurs dans votre script

  1. expansion du module RAID Un cité for i in ${test[@]};, au cours de laquelle l'élément avec seulement des espaces est tout simplement ignorée par shell
  2. et -z option juste vérifier une chaîne vide et non une chaîne avec des espaces

Vous besoin d'avoir,

test=("apple" "orange" " ") 
for i in "${test[@]}"; 
do 
    # Replacing single-spaces with empty 
    if [ -z "${i// }" ]; then 
     echo "Oh no!" 
    fi 
done 

La syntaxe d'extension de paramètre bash${MYSTRING//in/by} (ou) ${MYSTRING//in} est gourmande d'une manière qui remplace toutes les occurrences. Dans votre cas, remplacez tous les blancs-espaces par rien (chaîne nulle), de sorte que vous pouvez correspondre à la chaîne vide par -z

+1

Merci, ce que je avais besoin. – Xenidious

0

Utilisez une chaîne vide - pas d'espace lors de la vérification avec -z. Entourez ${array[@]} avec "" en bouclant.

test=("apple" "orange" "") 
for i in "${test[@]}"; 
do 
    if [[ -z "$i" ]]; then 
     echo "Oh no!" 
    fi 
done 
+0

Que se passe-t-il si je souhaite vérifier à la fois la chaîne vide et l'espace blanc? – Xenidious