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 17/11/2017, à 22:26

AGP-Architecture

[RESOLU] Distinction paramètre et options d'un script

Rebonsoir tout le monde,

Découvrant bash, je me pose un foultitude de question et risque donc de vous embêter un petit peu  big_smile et il me semble que certaines peuvent être scindée en plusieurs discussion. Maintenant si les modérateurs préfèrent que je fasse un seul poste pour plusieurs questions différentes et sans forcément de liens entre elle je m'éxécuterai.

Donc la nouvelle question est comment peut-on distinguer facilement en bash si l'argument passé à un script est une option avec - ou un simple paramètre du script?

Merci pour l'aide dans mon apprentissage de linux.

Dernière modification par AGP-Architecture (Le 23/11/2017, à 10:36)

Hors ligne

#2 Le 19/11/2017, à 10:24

Hizoka

Re : [RESOLU] Distinction paramètre et options d'un script

Salut, bienvenue dans le monde de bash smile
C'est de ça dont tu parles ?

function test()
{
for item in "${@}"
do
  [[ ${item:0:1} == "-" ]] && echo "${item} est une option" || echo "${item} est un paramétre"
done
}
test -u 55 popo -p

Dernière modification par Hizoka (Le 19/11/2017, à 10:37)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#3 Le 19/11/2017, à 11:28

Watael

Re : [RESOLU] Distinction paramètre et options d'un script

salut,

pour être sûr de son coup, pour gérer des options, utilisez getopts.

parce que, qu'arrive-t-il si un paramètre commence par un tiret ?

Dernière modification par Watael (Le 19/11/2017, à 11:28)


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

Hors ligne

#4 Le 19/11/2017, à 12:17

moko138

Re : [RESOLU] Distinction paramètre et options d'un script

Bonjour,

info getopts
Aucune entrée de menu « getopts » dans le nœud « (dir)Top ».

?
  - -

qu'arrive-t-il si un paramètre commence par un tiret ?

Ça existe donc ?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#5 Le 19/11/2017, à 12:43

pingouinux

Re : [RESOLU] Distinction paramètre et options d'un script

Bonjour,
@moko138 : getops est une "builtin command". Il faut faire

help getopts

Dernière modification par pingouinux (Le 19/11/2017, à 12:43)

Hors ligne

#6 Le 19/11/2017, à 13:03

bruno

Re : [RESOLU] Distinction paramètre et options d'un script

Hors ligne

#7 Le 19/11/2017, à 14:21

Watael

Re : [RESOLU] Distinction paramètre et options d'un script

il existe une commande getopt, qui est une commande externe, et qui gère assi les options longues.
mais on peut bricoler avec getopts pour obtenir un résultat ±équivalent.

Dernière modification par Watael (Le 19/11/2017, à 15:42)


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

Hors ligne

#8 Le 19/11/2017, à 15:31

moko138

Re : [RESOLU] Distinction paramètre et options d'un script

Oups ! Merci les gars mais ça vole beaucoup trop haut pour mon niveau actuel !


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#9 Le 19/11/2017, à 19:00

Hizoka

Re : [RESOLU] Distinction paramètre et options d'un script

J'ai pas voulu parler de getops car il dit débuter... je voulais voir avant ce qu'il voulait vraiment.

et perso j'avais eu des limitations avec getops du coup, j'avais fait une version maison. De mon point de vue, son seul vrai intérêt est la possibilité de concatener les options courtes.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 19/11/2017, à 19:39

ar barzh paour

Re : [RESOLU] Distinction paramètre et options d'un script

exemple d'un shell que j'utilise dans un programme
il n'est peut-être pas "optimum" et certainement améliorable mais il me sert bien et je m'en contente

#!/bin/bash
# syntaxe : ./nom-du-shell [-t] [-f] [-l fichier_log] [-m longueur-1ère-partie] -1 chaine1 [-2 chaine2]

# si -t est présent : affiche sur le terminal   : "chaine1(formatée suivant longueur) :chaine2"
# si -f est présent : archive dans fichier_log  : "chaine1(formatée suivant longueur) :chaine2"
#==================================================================================
T="" ; F="" ; max=30    # valeur par défaut
fich_log="renom.log"    # valeur par défaut du fichier log
chaine1=""              # chaine1 par défaut
chaine2=""              # chaine2 par défaut
#===============================================================================

# analyse en deux fois

# 1ère fois m seulement
while getopts ":tfm:l:1:2:" options
do
    case "$options" in
        m)  max="$OPTARG"       ;; #longueur de chaine pour formatage affichage #30 par défaut
        :) # argument manquant
            echo "ATTENTION $OPTARG requiert un argument"
            exit 1
        ;;    
        \?)  #inconnu
              # EDIT remplacer SH-Trace par le nom de ce shell                    
             $0 -t -m "$max" -1 "option non attendue" -2 "==>$OPTARG<==" 
             echo "taper Entrée pour continuer" ; read g ; exit 1
             ;;
    esac
done


# 2ème fois les autres paramètres
OPTIND=1
while getopts ":tfm:l:1:2:" options
do
    case "$options" in
    t)  T="-t"              ;; #-t=terminal traces
    f)  F="-f"              ;; #-f=fichier traces
    l)  fich_log="$OPTARG"  ;; #l=fichier log pour trace  #renom.log par défaut
    1)  chaine1="$OPTARG"   ;; #première partie de l'affichage
    2)  chaine2="$OPTARG"   ;; #deuxième partie de l'affichage
    :) # argument manquant
        echo "ATTENTION $OPTARG requiert un argument"
        exit 1
        ;;    
    \?)  #inconnu
      # EDIT remplacer SH-Trace par le nom de ce shell
          $0 -t -m "$max" -1 "option non attendue" -2 "==>$OPTARG<==" 
          echo "taper Entrée pour continuer" ; read g ; exit 1
          ;;
    esac
done
#============================================================================

if [[ ${#chaine1} -lt $max ]] #si longueur de chaine1 plus petite que $max, on allonge jusqu'à $max
  then
    chaine1="$chaine1 ......................................................................." 
    chaine1=${chaine1:0:$max}
    [[ -n $chaine2 ]] && chaine2="$chaine2<="
fi

# affichage sur terminal et/ou fichier =====================
[[ -n $T ]] && echo "$chaine1"" :"$chaine2
[[ -n $F ]] && echo "$chaine1"" :"$chaine2 >> "$fich_log"

exit 0

mettre ce code dans un fichier appelé Trace
le rendre exécutif
dans un terminal faire un appel par (un double clic sur le fichier ne donnera rien)

jpb@jpb-desktop:~$ ./Trace -t -m 50 -1 "CHAINE1" -2 "CHAINE2"
CHAINE1 .......................................... :CHAINE2<=
jpb@jpb-desktop:~$ 

Dernière modification par ar barzh paour (Le 21/11/2017, à 17:35)


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

#11 Le 20/11/2017, à 20:51

AGP-Architecture

Re : [RESOLU] Distinction paramètre et options d'un script

ok pile ce que je cherchais merci beaucoup mais je ne comprend pas ce que signifie :

":tfm:l:1:2:"
dans
while getopts ":tfm:l:1:2:" options

Dernière modification par AGP-Architecture (Le 20/11/2017, à 20:51)

Hors ligne

#12 Le 21/11/2017, à 10:05

ar barzh paour

Re : [RESOLU] Distinction paramètre et options d'un script

je prépare la réponse , mais en regardant l'exemple que j'ai donné , j'ai fait une erreur
il faut remplacer SH-Trace par Trace ( j'ai rectifié le shell)
et en ligne 26 remplacer $opt par $OPTARG
là c'est dans le détail ,
pour info complète taper help getopts dans un terminal

getopts est un peu tordue !!!!!

while getopts ":tfm:l:1:2:" options
getopts regarde s'il trouve les options t, f , m , l ,1 , 2
si l'option est suivi d'un point , cela veut dire que l'option nécessite un argument qui sera le paramètre suivant
les : du début permettre de gérer les erreurs , s'il y a une option incorrecte , OPTARG est initialisé avec la valeur de l'option


dans mon exemple
les options m l 1 et 2 devront avoir un argument (s'ils sont présents)
les options t  f n'ont pas d'argument

cas option non attendue

./Trace -g
option non attendue .......... :==>g<==<=
taper Entrée pour continuer

option t utilisée seule

./Trace -t
 ............................. :

option f utilisée seule

./Trace -f

!!!!  => Attention ici on ne voit rien mais un fichier renom.log a été créé

cas d'un e option nécessitant un paramètre

./Trace -t -1
ATTENTION 1 requiert un argument
./Trace -t -1 "retour de valeur"
retour de valeur ............. :

etc faire de essais .... il y a des anomalies

Dernière modification par ar barzh paour (Le 21/11/2017, à 17:28)


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

#13 Le 21/11/2017, à 12:59

serged

Re : [RESOLU] Distinction paramètre et options d'un script

moko138 a écrit :

Bonjour,

  - -

qu'arrive-t-il si un paramètre commence par un tiret ?

Ça existe donc ?

Par exemple :

rm -i - -toto

Par convention un tiret isolé signifie que les paramètres suivant sont des paramètres "simples". Dans mon exemple on effacera le fichier "-toto" avec l'option "-i" (poser la question avant)


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

#14 Le 21/11/2017, à 16:10

Watael

Re : [RESOLU] Distinction paramètre et options d'un script

pour indiquer que la fin des options, c'est deux tirets.
cf. info coreutils 'common options'


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

Hors ligne

#15 Le 21/11/2017, à 17:42

ar barzh paour

Re : [RESOLU] Distinction paramètre et options d'un script

@serged
ce doit plutôt être

rm -i -- -toto

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

#16 Le 22/11/2017, à 14:07

Watael

Re : [RESOLU] Distinction paramètre et options d'un script

ar barzh paour : je ne comprends pas le recours à deux boucles.

et, pour un echo, une seule paire de guillemets suffit :

echo "$chaine1 :$chaine2"

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

Hors ligne

#17 Le 23/11/2017, à 08:20

ar barzh paour

Re : [RESOLU] Distinction paramètre et options d'un script

j'ai écrit comme ça parce que la valeur donnée par -m est utilisée dans la deuxième passe dans les autres options
par exemple

$0 -t -m "$max" -1 "option non attendue" -2 "==>$OPTARG<=="

reste l'anomalie de la première passe s'il y avait une option inconnue mise avant -m ...

jpb@jpb-desktop:~$ ./Trace -g -t -m 50
option non attendue .......... :==>g<==<=
taper Entrée pour continuer
    
jpb@jpb-desktop:~$ ./Trace -t -m 50 -g
option non attendue .............................. :==>g<==<=
taper Entrée pour continuer

enfin dans cet exemple c'est pas trop visible
mais j'ai d'autres boucles de ce même type

Watael a écrit :

et, pour un echo, une seule paire de guillemets suffit :

oui

[[ -n $T ]] && echo "$chaine1"" :"$chaine2
[[ -n $F ]] && echo "$chaine1"" :"$chaine2 >> "$fich_log"

en modifiant le code , je ne rectifie pas toujours ce que j'ai écrit avant ....
en fait je m'amuse plus à découvrir le code qu'autre chose

[[ -n $T ]] && echo "$chaine1 :$chaine2"
[[ -n $F ]] && echo "$chaine1 :$chaine2" >> "$fich_log"

Dernière modification par ar barzh paour (Le 23/11/2017, à 08:28)


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

#18 Le 23/11/2017, à 10:36

AGP-Architecture

Re : [RESOLU] Distinction paramètre et options d'un script

Je ne m'attendais pas à ce que cette question soit aussi débattue. En attendant j'ai fait mes test et commence à comprendre le principe.

Merci beaucoup pour tous les éclaircissements.

Hors ligne

#19 Le 23/11/2017, à 10:45

Watael

Re : [RESOLU] Distinction paramètre et options d'un script

ar barzh paour :

j'ai l'impression que tu t'embêtes pour rien : les traitements ayant besoin de $max se déroulent après le parcours de toutes les options; le deuxième parcours que tu effectues ne l'utilise pas (sinon dans la gestion des erreurs).

Dernière modification par Watael (Le 23/11/2017, à 10:46)


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

Hors ligne

#20 Le 25/11/2017, à 20:31

ar barzh paour

Re : [RESOLU] Distinction paramètre et options d'un script

@ Watael

while getopts ":tfm:l:1:2:" options
do
    case "$options" in
    m)  max="$OPTARG"       ;; #longueur de chaine pour formatage affichage #30 par défaut
    t)  T="-t"              ;; #-t=terminal traces
    f)  F="-f"              ;; #-f=fichier traces
    l)  fich_log="$OPTARG"  ;; #l=fichier log pour trace  #renom.log par défaut
    1)  chaine1="$OPTARG"   ;; #première partie de l'affichage
    2)  chaine2="$OPTARG"   ;; #deuxième partie de l'affichage
    :) # argument manquant
        echo "ATTENTION $OPTARG requiert un argument" ; exit 1 ;;    
    \?)   #inconnu
           $0 -t -m "$max" -1 "option non attendue" -2 "==>$OPTARG<==" 
          echo "taper Entrée pour continuer" ; read g ; exit 1 ;;
    esac
done

à priori je dirais que tu as raison , c'est plus simple


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