Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/08/2016, à 10:46

Slyfox

[Résolu] Bash - Variable vide dans boucle for

Bonjour smile

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". roll

#! /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 Slyfox (Le 27/08/2016, à 12:41)

Hors ligne

#2 Le 27/08/2016, à 10:56

Slyfox

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 Slyfox (Le 27/08/2016, à 11:07)

Hors ligne

#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

Slyfox

Re : [Résolu] Bash - Variable vide dans boucle for

Salut pingouinux smile

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 Slyfox (Le 27/08/2016, à 11:53)

Hors ligne

#5 Le 27/08/2016, à 12:03

Slyfox

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 Slyfox (Le 27/08/2016, à 12:05)

Hors ligne

#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

Slyfox

Re : [Résolu] Bash - Variable vide dans boucle for

Et ben voilà quelque chose de propre et de pro ! cool

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 ! lol

Dernière modification par Slyfox (Le 27/08/2016, à 12:43)

Hors ligne

#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