web-dev-qa-db-fra.com

bash détermine si la variable est vide et si c'est le cas, quitte.

J'essaie d'effectuer ceci: J'ai un fichier de test qui md5sum contient des fichiers situés sur sftp. Les variables doivent contenir un md5sum (chaîne). Si la variable est vide, cela signifie qu'il n'y a pas de fichier sur le serveur sftp. J'essaie ce code mais ça ne marche pas ..

    if [ -z $I_IDOCMD5 ] || [ -z $I_LEGALMD5 ] || [ -z $I_ZIPMD5 ]
then
        echo "ERROR: At least one file not present of checksum missing no files will be deleted" >>$IN_LOG
        ERRORS=$ERRORS+2
else
 if [[ $I_IDOCMD5 == $($DIGEST -a md5 $SAPFOLDER/inward/idoc/$I_IDOC) ]]
   then
        echo "rm IDOC/$I_IDOC" >/SAP/commands_sftp.in
   else
        echo "problem with checksum"
        ERRORS=$ERRORS+2
 fi

 if [[ $I_LEGALMD5 == $($DIGEST -a md5 $SAPFOLDER/inward/legal/$I_LEGAL) ]]
   then
        echo "rm LEGAL/$I_LEGAL" >>/SAP/commands_sftp.in
   else
        echo "problem with checksum"
        ERRORS=$ERRORS+2
 fi

 if [[ $I_ZIPMD5 == $($DIGEST -a md5 $SAPFOLDER/inward/Zip/$I_Zip) ]]
   then
        echo "rm Zip/$I_Zip" >>/SAP/commands_sftp.in
   else
        echo "problem with checksum"
        ERRORS=$ERRORS+2
fi
13
user2653557

La réponse que je préfère est la suivante

[[ -z "$1" ]] && { echo "Parameter 1 is empty" ; exit 1; }
20
Pipo

Une façon de vérifier si une variable est vide est:

if [ "$var" = "" ]; then
    # $var is empty
fi

Une autre alternative plus courte est la suivante:

[ "$var" ] || # var is empty
14
user1019830

Dans bash, vous pouvez utiliser set -u qui provoque la fermeture de bash en cas d'échec de l'expansion du paramètre.

De bash man (section sur la set construite):

-u
Traitez les variables non définies et les paramètres autres que les paramètres spéciaux "@" et "*" comme une erreur lors de l’expansion du paramètre . Si une extension est tentée sur une variable non définie ou sur un paramètre , Le shell imprime un message d'erreur et, s'il n'est pas interactif, Se termine avec un statut différent de zéro.

Pour plus d'informations, je recommande cet article: http://redsymbol.net/articles/unofficial-bash-strict-mode/

2
Lirt

Vous pouvez utiliser un formulaire court:

FNAME="$I_IDOCMD5"
: ${FNAME:="$I_LEGALMD5"}
: ${FNAME:="$I_ZIPMD5"}
: ${FNAME:?"Usage: $0 filename"}

Dans ce cas, le script se ferme si aucune des variables I_... n'est déclarée, ce qui génère un message d'erreur précédé de la ligne de script Shell à l'origine du message.

Voir plus sur ceci dans abs-guide (recherche «Exemple 10-7»).

2
gluk47

Premier test seulement ceci (juste pour le réduire):

if [ -z "$I_IDOCMD5" ] || [ -z "$I_LEGALMD5" ] || [ -z "$I_ZIPMD5" ]
then
    echo "one is missing"
else
    echo "everything OK"
fi

echo "\"$I_IDOCMD5\""
echo "\"$I_LEGALMD5\""
echo "\"$I_ZIPMD5\""
1
thom

"Si la variable est vide, cela signifie qu'il n'y a pas de fichier sur le serveur sftp"

S'il n'y a pas de fichier sur le serveur sftp, est la variable alors vraiment vide?

Pas d'espaces cachés ou quelque chose comme ça? ou le nombre zéro (qui compte comme non-vide)?

0
thom