2017-09-29 1 views
0

J'ai plusieurs variables dans un tableau, je veux parcourir chacune de ces variables et trouver si elles sont vides.Recherche de variables vides dans le tableau bash

code:

declare -a CONFIG_PARAM=($Var_MODE $Var_Path $Var_Stage $Var_line $Var_CVG $Var_Operator) 
for PARAMS in "${CONFIG_PARAM[@]}"; do 
    if [ ! $PARAMS ]; then 
     echo -e "$PARAMS is empty" 
    fi 
done; 

Mais il ne semble pas attraper les variables vides. Quelqu'un peut-il indiquer ce qui ne va pas ou fournir une suggestion/solution? Merci d'avance pour votre aide.

+2

Citations. '" $ Var_MODE "" $ Var_PATH "' etc. Et '[! "$ PARAMS"] ' –

+0

Mais c'est seulement si vous avez besoin des valeurs. Si vous avez besoin des noms, vous devez utiliser une extension indirecte. –

+0

Merci J'ai juste essayé le et obtenu les valeurs mais j'avais besoin des noms de variables à imprimer! –

Répondre

4
declare -a config_params=(Var_MODE Var_Path Var_Stage Var_line Var_CVG Var_Operator) 
for param in "${config_params[@]}"; do 
    if ! [ -n "${!param}" ]; then 
     echo "$param is empty" 
    fi 
done 

Note:

+0

Merci beaucoup, c'est très utile. Mais j'ai essayé le code ci-dessus, il imprime toujours les valeurs des variables au lieu des noms variables. –

+0

@GopinathS, ... euh ... non, ce n'est pas le cas. Voir ce code en cours d'exécution à https://ideone.com/4iUpnd –

+0

Mon mauvais, je n'ai pas supprimé '$' pour les variables dans le tableau, désolé à ce sujet. Maintenant, j'ai compris le concept de référence indirecte de votre note. Merci beaucoup, appréciez votre aide. –

1

Il s'agit d'un cas où (IMO) la boucle rend votre code moins lisible. Il y a quelque chose à dire pour une belle liste verticale d'appels, une ligne par variable.

check_empty() { 
    [ -z "${!1}" ] && printf '%s is empty\n' "$1" 
} 

et de faire un appel distinct pour chaque variable.

check_empty Var_MODE 
check_empty Var_Path 
check_empty Var_Stage 
check_empty Var_line 
check_empty Var_CVG 
check_empty Var_Operator 

En fait, vous n'avez même pas besoin d'une fonction séparée. L'opérateur d'extension de paramètre :? affichera un message d'erreur, avec le nom de la variable, s'il est vide.

: ${Var_MODE?empty} || : 
: ${Var_Path?empty} || : 
: ${Var_Stage?empty} || : 
: ${Var_line?empty} || : 
: ${Var_CVG?empty} || : 
: ${Var_Operator?empty} || : 

Le || : arrière empêche le script de sortir lorsque la variable est vide.