#1 Le 07/01/2022, à 15:48
- PowaBanga
[BASH] Passer des paramètres dans une fonction et les vérifier
Salut à tous,
j'essaye de faire un petit script qui va automatiquement configurer les dossiers pour un utilisateur
j'ai donc fait une boucle qui checke les option pour lancer les fonctions qui vont avec.
J'aimerais aussi vérifier que chaque options comprte le nombre appropriés de paramètre. En l'occurence elles doivent toute avoir exactement une option.
Je me suis donc lancé sur la fonction `CheckOptions` que je teste sur l'option `-u`
CheckOptions()
{
if [ -z $3 ]
then
echo "$3 il manque un parametre"
# S'il y a un 2iem parametre .
elif [ -z $4 ]
then
# Et s'il s'agit d'une option, on continue
elif[ $4 = "-h"|"--help"|"-u"|"--username"|"-h"|"--hostname"|"-d"|"--desktop" ]
then
$1 $2
# si non on arrête
else
echo "$3 comporte un parametre en trop"
fi
fi
fi
}
username()
{
echo "username = $1"
}
for i in $all
do
case $i in
""|help|"--help"|"-h") Help ;;
"-u"|"--username") echo "$1;$2;$3;$4;$5" ;CheckOptions username $2 $1;;
"-h"|"--hostname") echo groupname ;;
"-d"|"--desktop") echo "arg $2 $3" ;;
esac
done
mais je reçois l'erreur suivante : ;
line 25: syntax error near unexpected token `then'
J'ai un peu du mal à réaliser mon truc... Si quelqu'un a des idées il est le bienvenue
Dernière modification par PowaBanga (Le 07/01/2022, à 15:56)
Hors ligne
#2 Le 07/01/2022, à 17:37
- Watael
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
il manque un espace au deuxième elif.
pour les options, il y a getopts.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 07/01/2022, à 18:30
- ar barzh paour
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
un exemple de getopts que j'utilise dans un batch
#!/bin/bash
T="" ; F=""
max=30 #valeur par défaut longueur chaine affichage première partie
fich_log="renom.log" #valeur par défaut fichier log
# analyse en deux fois
# 1ère fois m seulement
while getopts ":tfm:l:" options
do
case "$options" in
m) #=longueur de chaine pour formatage affichage correct
max="$OPTARG" #30 par défaut
./SH-Trace -t -m "$max" -1 "longueur pour affichage" -2 "$max"
;;
:) # argument manquant
./SH-Trace -t -m "$max" -1 "ATTENTION $OPTARG requiert un argument"
exit 1
;;
\?)
echo "non attendu :*****$OPTARG*****"
echo "taper Entrée pour continuer" ; read g
;;
esac
done
./SH-Trace -t -m "$max" -1 "\ndébut du SHELL" -2 "$0"
typ=`sed "s/.\///" <<< "$0"` # donnera SH-xxxx utilisée dans rep.txt ( $0 mais sans ./ du début )
# 2ème fois
OPTIND=1
while getopts ":tfm:l:" options
do
case "$options" in
t)
T="-t"
./SH-Trace -t -m "$max" -1 "trace terminal demandé par" -2 "$0"
;;
f)
F="-f"
./SH-Trace -t -m "$max" -1 "trace fichier demandée par" -2 "$0"
;;
l) # l=fichier log pour trace
fich_log="$OPTARG" #renom.log par défaut
./SH-Trace $T -m "$max" -1 "fichier log" -2 "$fich_log"
;;
:) # argument manquant
./SH-Trace -t -m "$max" -1 "ATTENTION $OPTARG requiert un argument"
exit 1
;;
\?)
echo "non attendu :*****$OPTARG*****"
echo "taper Entrée pour continuer" ; read g
;;
esac
done
voir
help getopts
Dernière modification par ar barzh paour (Le 07/01/2022, à 18:44)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#4 Le 08/01/2022, à 17:53
- PowaBanga
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
Merci Watael et ar barzh paour !
Du coup j'a un peu regardé getops ici
et j'ai pondu ce petit script pour étudier la question :
RUN=TRUE
while getopts ":abcd:e:" option
do
echo "getopts a trouvé l'option $option"
case $option in
a)
echo "Exécution des commandes de l'option a"
echo "Indice de la prochaine option à traiter : $OPTIND"
;;
b)
echo "Exécution des commandes de l'option b"
echo "Indice de la prochaine option à traiter : $OPTIND"
;;
c)
echo "Exécution des commandes de l'option c"
echo "Indice de la prochaine option à traiter : $OPTIND"
;;
d)
echo "Exécution des commandes de l'option d"
echo "Liste des arguments à traiter : $OPTARG"
echo "Indice de la prochaine option à traiter : $OPTIND"
shift $((OPTIND-1))
echo "Liste des arguments après -1 : $OPTARG"
;;
e)
echo "Exécution des commandes de l'option e"
echo "Liste des arguments à traiter : $OPTARG"
echo "Indice de la prochaine option à traiter : $OPTIND"
echo "arg = $ARG"
echo "OPTERR = $OPTERR"
#shift $((OPTIND-1))
#echo "Liste des arguments après -1 : $OPTARG"
;;
:)
echo "L'option $OPTARG requiert un argument"
RUN=FALSE
;;
\?)
echo "$OPTARG : option invalide $1"
RUN=FALSE
;;
esac
done
echo "Analyse des options terminée"
if [[ $RUN = TRUE ]]; then
echo "continuer"
else
echo "stop !"
exit 1
fi
Et donc, la question a la quelle je n'ai pas trouvé de réponse, c'est : est-il possible de détecter qu'un argument en trop à été tapé ?
par exemple ici, si je tape
monscritp.sh -e prune patate
l'argument "prune" est pris en compte, mais je n'ai aucune trace de patate, c'est comme si on ne l'avait pas tapé...
Moi, je voudrais pouvoir stopper le script si on a tapé n'importe quoi...
Dernière modification par PowaBanga (Le 08/01/2022, à 18:24)
Hors ligne
#5 Le 08/01/2022, à 20:23
- Watael
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
"n'importe quoi" par rapport à l'entrée attendue. mais quelle est-elle ?
Dernière modification par Watael (Le 08/01/2022, à 22:07)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#6 Le 08/01/2022, à 22:04
- PowaBanga
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
je veux dire par là, que si je configure une option qui peut prendre un paramètre, le prénom de l'utilisateur par exemple...
Et que j'ai quelqu'un qui me met son nom de famille en plus alors que je n'en veux pas, voir même qu'il me met son nom de famille en premier
RUN=TRUE
while getopts "n:" option
do
case $option in
n)
echo "Ton prénom est $OPTARG"
;;
:)
echo "L'option $OPTARG requiert un argument"
RUN=FALSE
;;
\?)
echo "$OPTARG : option invalide $1"
RUN=FALSE
;;
esac
done
if [[ $RUN = TRUE ]]
then
echo "continuer"
else
echo "stop !"
exit 1
fi
Moi je souhaiterais pouvoir forcer l'arrêt du script donc, en laissant une message tel que
"L'option "-n" ne peut recevoir qu'un seul paramètre !"
Dernière modification par PowaBanga (Le 08/01/2022, à 22:08)
Hors ligne
#7 Le 08/01/2022, à 23:55
- Watael
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
une option ne prend qu'un argument : le "mot" qui suit l'option.
le reste est placé dans l'ensemble des paramètres positionnels.
Dernière modification par Watael (Le 08/01/2022, à 23:56)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#8 Le 09/01/2022, à 00:14
- PowaBanga
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
Heu... je ne suis pas sûr de comprendre ce que tu dis...
Ok admettons...
Si je lance donc mon script :
Monscript.sh -n powa banga
Est-il possible de récupérer la valeur "Banga" autrement que via un "$2" ?
Dernière modification par PowaBanga (Le 09/01/2022, à 00:15)
Hors ligne
#9 Le 09/01/2022, à 02:13
- Watael
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
ajoute ceci après la boucle while getopts :
shift $((--OPTIND))
echo "tous les paramètres positionnels après getopts :"
for ((i=1;i<=$#; i++)); do echo "\$$i = ${!i}"; done
echo "liste des éléments restants :"
printf '%s\n' "$@"
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#10 Le 09/01/2022, à 19:35
- erresse
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
Bonsoir,
À mon avis, ce que PowaBanga cherche à faire, ce n'est pas de passer une ou des options à son script mais tout bêtement des paramètres, non ?
Et dans ce cas, il suffit de tester le nombre de paramètres passés dans la ligne de commande pour savoir s'il y en a un de trop ou de pas assez.
Pourquoi se compliquer la vie avec une gestion des options ?
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#11 Le 09/01/2022, à 19:49
- Watael
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
Pourquoi se compliquer la vie avec une gestion des options ?
parce que c'est ce qui est "fait" dans le script initial.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#12 Le 10/01/2022, à 14:54
- erresse
Re : [BASH] Passer des paramètres dans une fonction et les vérifier
erresse a écrit :Pourquoi se compliquer la vie avec une gestion des options ?
parce que c'est ce qui est "fait" dans le script initial.
Certes, mais... est-ce nécessaire ? PowaBanga ne s'est-il simplement pas trompé de solution en choisissant la gestion des options ?
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne