#1 Le 23/12/2020, à 19:12
- lebossejames
[Résolu] bash génération dynamique de condition
Bonjour,
Je souhaiterais effectuer un listing de tous les répertoires présent dans le dossier release puis afficher un menu demandant le choix par un entier correspondant à la position dans cette liste ici products, mais je confronté au problème lié à la génération dynamique du if après le read qui permettra de diriger mes tâches, est-il possible de le faire? Comme on dit, ensemble tout devient possible mais je n'arrive pas à savoir comment procéder de la sorte:
choiceproduct () {
products=($(ls release))
var=1;
for prod in ${products[@]}
do
echo "Press $var product $prod"
var=$((var+1))
done
echo "Press x to exit the script"
read -p "Input Selection:" choiceproductinput
if [ "$choiceproductinput" = "1" ]; then
productSelected=${products[0]};
elif [ "$choiceproductinput" = "2" ]; then
productSelected=${products[1]};
elif [ "$choiceproductinput" = "x" ];then
exit
elif [ "$choiceproductinput" = "X" ];then
exit
else
echo "You have entered an invalid selection!"
echo "Please try again!"
echo ""
echo "Press any key to continue..."
read -n 1
clear
choiceproduct
fi
}
Merci d'avance.
Dernière modification par lebossejames (Le 24/12/2020, à 17:15)
Hors ligne
#2 Le 23/12/2020, à 19:36
- Watael
Re : [Résolu] bash génération dynamique de condition
non, non, non...
d'abord, pas ls : c'est sale.
cd release
products=( */ )
cd
enfin, une sélection peut se faire avec select !
Dernière modification par Watael (Le 23/12/2020, à 19:37)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 24/12/2020, à 08:01
- serged
Re : [Résolu] bash génération dynamique de condition
Et avec du, c'est pas plus simple ?
cd ~/release
du -a
cd -
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#4 Le 24/12/2020, à 08:37
- Watael
Re : [Résolu] bash génération dynamique de condition
ça ne répond pas à la problématique : afficher un menu demandant le choix par un entier...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 24/12/2020, à 09:22
- FrancisFDZ
Re : [Résolu] bash génération dynamique de condition
Ne serait-ce pas mieux avec un "case" ?
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#6 Le 24/12/2020, à 09:25
- Watael
Re : [Résolu] bash génération dynamique de condition
pas nécessairement après, puisqu'il semble que l'action sera la même - il n'est question que de choisir le fichier à traiter.
et, pas pour générer le menu.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 24/12/2020, à 13:37
- nany
Re : [Résolu] bash génération dynamique de condition
Bonjour,
choiceproduct () {
cd release || return
products=( */ )
cd || return
########## MENU ##########
var=0
for prod in "${products[@]}"
do
var=$((var+1))
echo "Press $var product $prod"
done
echo "Press x to exit the script"
echo
########## MENU ##########
read -rp "Input Selection: " choiceproductinput
# si $choiceproductinput est un entier compris entre 1 et $var
if [[ "$choiceproductinput" =~ ^[0-9]+$ && "$choiceproductinput" -ge 1 && "$choiceproductinput" -le "$var" ]]; then
productSelected="${products["$choiceproductinput"-1]}"
elif [ "${choiceproductinput,,}" = "x" ]; then
exit
else
echo "You have entered an invalid selection!"
echo "Please try again!"
echo ""
echo "Press any key to continue..."
read -rn 1
clear
choiceproduct
fi
}
Dernière modification par nany (Le 24/12/2020, à 13:37)
Hors ligne
#8 Le 24/12/2020, à 15:45
- Watael
Re : [Résolu] bash génération dynamique de condition
ou alors, vous utilisez select !
cd release/ # bien sûr, on a testé que le répertoire existe, et est accessible
products=( * )
cd # je ne vois pas ce qui le ferais échoué
select fichier in "${products[@]}"
do
echo "action avec \"$f\""
break
done
done !
PS :
for i in ${!products[*]}
do
echo "$((i+1)) - ${products[i]}"
done
read -p 'choix : ' choix
(( 0 < $choix && $choix <= ${#products[*]} )) \
&& echo "action avec \"${products[choix-1]}\"" \
|| { >&2 echo "err n° choix"; exit 1;}
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 24/12/2020, à 17:14
- lebossejames
Re : [Résolu] bash génération dynamique de condition
Merci ça marche.
Hors ligne
#10 Le 25/12/2020, à 08:48
- serged
Re : [Résolu] bash génération dynamique de condition
ça ne répond pas à la problématique : afficher un menu demandant le choix par un entier...
Avec un case, c'est faisable et simple...
Exemple de question "oui-non" dans mes scripts :
echo -en "La suite ? (o/N)"
read rep
case $rep in
o|O|y|Y) echo "La suite..."
esac
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#11 Le 25/12/2020, à 09:18
- Watael
Re : [Résolu] bash génération dynamique de condition
là, tu n'affiches pas un menu, tu vérifies le choix fait dans le menu.
l'OP te demande la carte, et tu lui apportes l'addition. ±
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne