#1 Le 20/04/2017, à 22:54
- GammaDraconis
Besoin d'aide : en Bash comment créer une condition avec un tableau ?
Bonjour,
Prenons cet exemple :
Afficher : saisir un nom
tableau 1 : fraise, framboise, orange, cerise
tableau 2 : chien, chat, souris, guepardSi valeur (nom saisi) présente dans tableau 1 alors afficher : vous avez saisi un fruit
Si valeur (nom saisi) présente dans tableau 2 alors afficher : vous avez saisi un animal
Sinon afficher : valeur inconnu
Comment feriez vous en l'ecrivant avec le moins de caractère possible en script bash ?
Je sais le faire avec pleins de If
( Si valeur = fraise alors...... sinon si valeur = framboise alors.... sinon si valeur = orange alors...... etc...
mais c'est trop long a écrire si il y a énormément de valeur a vérifier (trop de if), ça serai plus rapide ds un tableau mais je ne sais pas comment faire. (il me semble que c'est avec case/esac)
Merci d'avance.
Dernière modification par GammaDraconis (Le 20/04/2017, à 22:58)
Discussion sur mon script de post-install pour Ubuntu 20.04LTS : https://forum.ubuntu-fr.org/viewtopic.php?id=2026344
Lien direct script : https://github.com/simbd/Ubuntu_20.04LTS_PostInstall
Démo vidéo (peertube) : https://video.ploud.fr/videos/watch/fb7 … 0d252ed2db
Hors ligne
#2 Le 21/04/2017, à 00:38
- Arbiel
Re : Besoin d'aide : en Bash comment créer une condition avec un tableau ?
Quelque chose comme cela
function y { local saisie="${1}";
for a in $(echo ${animal[*]}); do [[ "${saisie}" = "${a}" ]] && { echo "C'est un animal" ; return 0 ; } ; done;
for a in $(echo ${fruit[*]}); do [[ "${saisie}" = "${a}" ]] && { echo "C'est un fruit" ; return 0 ; } ; done;
echo "Ce n'est ni un animal, ni un fruit"; return 1
}
devrait faire l'affaire.
Voila ce que cela donne
remi@remi-Vostro-3550:~$ animal=(tigre panthère lion)
remi@remi-Vostro-3550:~$ fruit=(fraise orange pomme poire)
remi@remi-Vostro-3550:~$ y tigre
C'est un animal
remi@remi-Vostro-3550:~$ y fraise
C'est un fruit
remi@remi-Vostro-3550:~$ y automobile
Ce n'est ni un animal, ni un fruit
remi@remi-Vostro-3550:~$
Arbiel
Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.
Hors ligne
#3 Le 21/04/2017, à 03:32
- Watael
Re : Besoin d'aide : en Bash comment créer une condition avec un tableau ?
salut,
la subtitution de commande est inutile.
les tableaux doivent être appelés, entre guillemets, avec @, pour que la liste par élément soit faite correctement.
entre crochets doubles, les guillemets sont facultatifs, et les accolades inutiles (elles ne le sont que lorsque la variable est immédiatement suivie par un caractère (lettre, chiffre, certaines ponctuations)).
on peut factoriser :
isInArray () {
cherche=$1;
shift;
declare -n tableau=$1;
for i in "${tableau[@]}";
do
test "$cherche" = "$i" && { echo "$cherche est dans \${$1[@]}"; return 0;};
done;
shift;
if (($#>=1));
then
isInArray "$cherche" "$@" || { echo "$cherche n'est pas dans un tableau"; return 1;};
else
return;
fi;
}
$ isInArray tigre animal fruit
tigre est dans ${animal[@]}
$ isInArray poire animal fruit
poire est dans ${fruit[@]}
$ isInArray automobile animal fruit
automobile n'est pas dans un tableau
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#4 Le 21/04/2017, à 07:31
- Hizoka
Re : Besoin d'aide : en Bash comment créer une condition avec un tableau ?
Watael, je suis d'accord avec Arbiel, il vaut mieux prendre une bonne habitude et toujours écrire ${var} que $var et puis chercher 3 plombs car finalement on à oublié les {} dans ce cas là...
de même entre [[ ]] je mets aussi des "", alors oui c'est inutile mais encore une fois, ça évite des soucis quand tu fais toujours le plus (et le jour tu fais pas gaffe que tu mets que de simples [ ] ça passera...).
Et surtout ça ne pose aucun souci de le faire.
Bon après le echo dans le for...
Soit les variables
fruit=(fraise orange pomme poire)
animal=(tigre panthère lion)
nouveau=canard
if [[ $(grep -w "${nouveau}" <<< "${animal[@]}" &>/dev/null) ]]
then
echo "${nouveau} existe djà dans ${animal[@]}"
elif [[ $(grep -w "${nouveau}" <<< "${fruit[@]}" &>/dev/null) ]]
then
echo "${nouveau} existe djà dans ${fruit[@]}"
else
echo "${nouveau} n'existe pas encore."
fi
ou
function recherche
{
grep -w "${nouveau}" <<< "${animal[@]}" &>/dev/null && { echo "${nouveau} existe djà dans ${animal[@]}"; return; }
grep -w "${nouveau}" <<< "${fruit[@]}" &>/dev/null && { echo "${nouveau} existe djà dans ${fruit[@]}"; return; }
echo "${nouveau} n'existe pas encore."
}
recherche "${nouveau}"
Dernière modification par Hizoka (Le 21/04/2017, à 07:54)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne