#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 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
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.
En 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
Un bon tuto sur getops : http://wiki.bash-hackers.org/howto/getopts_tutorial
#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.
En 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 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
#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 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
#13 Le 21/11/2017, à 12:59
- serged
Re : [RESOLU] Distinction paramètre et options d'un script
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.
En 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 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
#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.
En 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
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 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
#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.
En 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 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