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 07/01/2022, à 16: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'

hmm J'ai un peu du mal à réaliser mon truc... Si quelqu'un a des idées il est le bienvenue smile

Dernière modification par PowaBanga (Le 07/01/2022, à 16:56)

Hors ligne

#2 Le 07/01/2022, à 18: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.

Hors ligne

#3 Le 07/01/2022, à 19: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, à 19:44)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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, à 18: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... smile

Dernière modification par PowaBanga (Le 08/01/2022, à 19:24)

Hors ligne

#5 Le 08/01/2022, à 21: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, à 23:07)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 08/01/2022, à 23: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, à 23:08)

Hors ligne

#7 Le 09/01/2022, à 00: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 09/01/2022, à 00:56)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 09/01/2022, à 01: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, à 01:15)

Hors ligne

#9 Le 09/01/2022, à 03: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.

Hors ligne

#10 Le 09/01/2022, à 20: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 résolu, 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, à 20:49

Watael

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.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 10/01/2022, à 15:54

erresse

Re : [BASH] Passer des paramètres dans une fonction et les vérifier

Watael a écrit :
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 résolu, 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