#1 Le 27/08/2016, à 10:46
- Compte supprimé
[Résolu] Bash - Variable vide dans boucle for
Bonjour
Voici un mini script qui permet de tester si "var" est vide ou des fichiers ou des dossiers:
#! /bin/bash
var="/home
/home/$USER"
old_IFS=${IFS} # sauvegarde IFS
IFS=$'\n' # modification de l'IFS pour qu'il passe en saut de ligne
message=$(for i in ${var}; do
if [[ -z "${i}" ]]; then
echo -e "La variable est vide"
elif [[ -d ${i} ]]; then
echo -e "${i} est un dossier"
elif [[ -f ${i} ]]; then
echo -e "${i} est un fichier"
fi
done)
echo -e "Voici le résultat du test: \n${message}"
IFS=$old_IFS # IFS par défaut
Le problème si je fais le test avec une variable "vide" il ne fonctionne pas car normalement il devrait me retourner "La variable est vide".
#! /bin/bash
var=""
old_IFS=${IFS} # sauvegarde IFS
IFS=$'\n' # modification de l'IFS pour qu'il passe en saut de ligne
message=$(for i in ${var}; do
if [[ -z "${i}" ]]; then
echo -e "La variable est vide"
elif [[ -d ${i} ]]; then
echo -e "${i} est un dossier"
elif [[ -f ${i} ]]; then
echo -e "${i} est un fichier"
fi
done)
echo -e "Voici le résultat du test: \n${message}"
IFS=$old_IFS # IFS par défaut
Pourquoi ?
Edit
Remplacement de IFS=old_IFS # IFS par défaut par IFS=$old_IFS # IFS par défaut (poste #3)
Dernière modification par Compte supprimé (Le 27/08/2016, à 12:41)
#2 Le 27/08/2016, à 10:56
- Compte supprimé
Re : [Résolu] Bash - Variable vide dans boucle for
Je viens d'essayer de mettre des guillemets à cette ligne:
message=$(for i in "${var}"; do
Cette fois cela fonctionne pour la variable vide mais plus pour le test des fichiers ou dossiers.
Dernière modification par Compte supprimé (Le 27/08/2016, à 11:07)
#3 Le 27/08/2016, à 11:15
- pingouinux
Re : [Résolu] Bash - Variable vide dans boucle for
Bonjour,
message=$(for i in ${var}; do
Si la variable var est vide, tu ne passes pas dans la boucle.
message=$(for i in "${var}"; do
Tu passes une seule fois dans la boucle, et i va contenir la liste des fichiers ou répertoires.
Tu peux t'en assurer en ajoutant dans la boucle
echo "=$i="
Ajouté :
Et la dernière ligne doit être
IFS=$old_IFS # IFS par défaut
Dernière modification par pingouinux (Le 27/08/2016, à 11:19)
Hors ligne
#4 Le 27/08/2016, à 11:40
- Compte supprimé
Re : [Résolu] Bash - Variable vide dans boucle for
Salut pingouinux
J'ai bien compris ce que tu expliques ci-dessus.
Mais ça veut dire que ce n'est pas possible de tester une variable vide avec d'autre condition dans une boucle for ?
Edit:
J'ai remplacé au post #1 IFS=old_IFS # IFS par défaut IFS=$old_IFS # IFS par défaut
Merci pour la remarque.
Dernière modification par Compte supprimé (Le 27/08/2016, à 11:53)
#5 Le 27/08/2016, à 12:03
- Compte supprimé
Re : [Résolu] Bash - Variable vide dans boucle for
C'est bon je crois que j'ai trouvé, c'est pas très propre mais ça marche.
Exemple avec plusieurs dossiers:
#! /bin/bash
var="/home
/home/$USER"
old_IFS=${IFS} # sauvegarde IFS
IFS=$'\n' # modification de l'IFS pour qu'il passe en saut de ligne
if [[ -z "${var}" ]]; then
message="La variable est vide"
else message=$(for i in ${var}; do
if [[ -d ${i} ]]; then
echo "${i} est un dossier"
elif [[ -f ${i} ]]; then
echo "${i} est un fichier"
fi
done)
fi
echo -e "Voici le résultat du test: \n${message}"
IFS=$old_IFS # IFS par défaut
Exemple avec variable vide:
#! /bin/bash
var=""
old_IFS=${IFS} # sauvegarde IFS
IFS=$'\n' # modification de l'IFS pour qu'il passe en saut de ligne
if [[ -z "${var}" ]]; then
message="La variable est vide"
else message=$(for i in ${var}; do
if [[ -d ${i} ]]; then
echo "${i} est un dossier"
elif [[ -f ${i} ]]; then
echo "${i} est un fichier"
fi
done)
fi
echo -e "Voici le résultat du test: \n${message}"
IFS=$old_IFS # IFS par défaut
Dernière modification par Compte supprimé (Le 27/08/2016, à 12:05)
#6 Le 27/08/2016, à 12:26
- pingouinux
Re : [Résolu] Bash - Variable vide dans boucle for
Tu peux faire ceci, qui semble faire ce que tu veux :
message=$(while read i; do
if [[ -z "${i}" ]]; then
echo -e "La variable est vide"
elif [[ -d ${i} ]]; then
echo -e "${i} est un dossier"
elif [[ -f ${i} ]]; then
echo -e "${i} est un fichier"
fi
done <<<"$var")
Hors ligne
#7 Le 27/08/2016, à 12:39
- Compte supprimé
Re : [Résolu] Bash - Variable vide dans boucle for
Et ben voilà quelque chose de propre et de pro !
Merci du coup de main et d'avoir pris du temps pour résoudre ce problème.
Sinon en moralité une variable vide dans une boucle for c'est possible mais c'est moche !
Dernière modification par Compte supprimé (Le 27/08/2016, à 12:43)
#8 Le 27/08/2016, à 15:32
- pingouinux
Re : [Résolu] Bash - Variable vide dans boucle for
Avec la méthode en #6, tu n'as d'ailleurs même pas besoin de redéfinir IFS.
Hors ligne
#9 Le 27/08/2016, à 19:52
- Watael
Re : [Résolu] Bash - Variable vide dans boucle for
si une variable doit contenir une liste, alors on utilise une variable tableau !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne