2017-01-23 4 views
1

J'ai un script qui va vérifier plusieurs conditions dans if et exécuter une commande si elle est vraie.Déterminez laquelle des multiples conditions est vraie

if [ ! -f /tmp/a ] && [ ! -f /tmp/b ]; then 
     touch /tmp/c else 
     echo "file exists" fi 

Je voudrais maintenant besoin de savoir qui de la condition multiple était vrai. Par exemple:/tmp/a ou/tmp/b qui a déjà existé. Y a-t-il un moyen d'obtenir cela dans mon autre état?

Répondre

0

Étant donné que votre if utilise une condition composée, il est impossible pour else de déterminer quelle partie de l'état du composant a échoué. Vous pouvez réécrire votre code de cette façon:

a_exists=0 
b_exists=0 
[[ -f /tmp/a ]] && a_exists=1 # flag set to 1 if /tmp/a exists 
[[ -f /tmp/b ]] && b_exists=1 # flag set to 1 if /tmp/b exists 
if [[ $a_exists == 0 && $b_exists == 0 ]]; then 
    touch /tmp/c 
else 
    [[ $a_exists == 1 ]] && echo "a exists" 
    [[ $b_exists == 1 ]] && echo "b exists" 
fi 
+0

pourriez-vous s'il vous plaît expliquer? Je suis assez confus :) – user2700022

+0

Fondamentalement, nous utilisons deux drapeaux qui sont définis en fonction de l'existence du fichier. Ensuite, le bloc if-else utilisera ces drapeaux sans avoir à se soucier de la façon dont ils ont été définis. – codeforester

+1

oh, il était nouveau pour moi que nous puissions définir [[]] avec out si et aussi en réglant des drapeaux comme celui-ci. Merci beaucoup. – user2700022

0

Cela sent comme un jour il y aura plus de deux fichiers à vérifier. Utilisez une boucle:

i_am_happy=yeah 
for f in a b 
do 
    if [[ ! -f /tmp/$f ]] 
    then 
     echo "Criminy! No $f in tmp!" # or what else you would like to do. 
     i_am_happy=nope 
    fi 
done 
[[ i_am_happy == nope ]] && touch /tmp/c