Re: Contenu de $OPTARG avec getopts pour analyser les options d'un script en bash
Le 06/10/2024 à 15:41, benoit a écrit :
Pour l'instant, je intéresse à getopts (avec un "s") qui fait partie du bash, mais si getopt répond mieux à ce que je veux faire, je suis prenneur
(rappel: j'y connais que dalle)
j'ai cherché getops qui n'était pas installé sur mon système, il est
dans libbash que j'ai installé et j'ai lu sa manpage dont j'extrais ceci:
"[...]
getopts(1) (or 1posix on some systems) implemented by bash
getopts(3) implemented by libbash.
getopt(1) implemented by getopt utils (part of util-linux)
getopt_long(1) implemented by libbash and installed to section
1 instead of 3 to prevent collision with C man pages.
getopt(3) implemented by GNU C library.
getopt_long(3) implemented by GNU C library.
[...]"
donc entre getopt et getops ça a l'air d'être une simple question
d'implémentation avec d'éventuelles différences relativement mineures
(j'ai pas creusé) entre l'implémentation du paquet libbash et celle du
paquet util-linux (installé par défaut sur ma Debian)
Et testant ce que retourne "$@", j'ai l'impression (je découvre et je n'y connais rien, dis moi si je me trompe) que "$@" c'est stdin "en vrac" tout ce qui vient après la commande et que getopts et là pour m'aider à traiter les options.
[...]
pour l'usage de "$@", je te colle ci-dessous le fichiers
/usr/share/doc/util-linux/examples/getopt-example.bash
(y a rien de vraiment intéressant dans /usr/share/doc/libbash),
===============================================================
#!/bin/bash
# A small example script for using the getopt(1) program.
# This script will only work with bash(1).
# A similar script using the tcsh(1) language can be found
# as getopt-example.tcsh.
# Example input and output (from the bash prompt):
#
# ./getopt-example.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore
-b " very long "
# Option a
# Option c, no argument
# Option c, argument 'more'
# Option b, argument ' very long '
# Remaining arguments:
# --> 'par1'
# --> 'another arg'
# --> 'wow!*\?'
# Note that we use "$@" to let each command-line parameter expand to a
# separate word. The quotes around "$@" are essential!
# We need TEMP as the 'eval set --' would nuke the return value of getopt.
TEMP=$(getopt -o 'ab:c::' --long 'a-long,b-long:,c-long::' -n
'example.bash' -- "$@")
if [ $? -ne 0 ]; then
echo 'Terminating...' >&2
exit 1
fi
# Note the quotes around "$TEMP": they are essential!
eval set -- "$TEMP"
unset TEMP
while true; do
case "$1" in
'-a'|'--a-long')
echo 'Option a'
shift
continue
;;
'-b'|'--b-long')
echo "Option b, argument '$2'"
shift 2
continue
;;
'-c'|'--c-long')
# c has an optional argument. As we are in quoted mode,
# an empty parameter will be generated if its optional
# argument is not found.
case "$2" in
'')
echo 'Option c, no argument'
;;
*)
echo "Option c, argument '$2'"
;;
esac
shift 2
continue
;;
'--')
shift
break
;;
*)
echo 'Internal error!' >&2
exit 1
;;
esac
done
echo 'Remaining arguments:'
for arg; do
echo "--> '$arg'"
done
===============================================================
Reply to: