Re: Contenu de $OPTARG avec getopts pour analyser les options d'un script en bash
salut,
On Fri, Oct 04, 2024 at 04:37:01PM +0000, benoit wrote:
> Si par exemple, je voulais écrire un script qui concatène des fichiers dans le
> fichier destination.txt
> % ./monscript -i fichier1.txt fichier2.txt -o destination.txt
respecter les conventions unix rendent tes scripts
* plus faciles à écrire
* plus facile à prendre en main
* plus génériques et manipulables ( si tu peux eviter -o et écrire dans
stdout, ce serait bien)
ces conventions sont:
* les flags puis la liste des input
* si la liste est vide, stdin est l'input
* si la liste contient -, c'est pour traiter stdin
* le résutat s'affiche par defaut dans stdout (ca permet de piper, par exemple)
* les messages pour l'humain (et pas seulement les erreurs) dans stderr
demo ( /bin/sh)
dest=stdout
set -- -o target source1 source2 source3
while getopts ho: arg; do
case "$arg"
in (h) usage
;; (o) dest=$OPTARG
esac
done
shift $((OPTIND - 1))
for it; do
echo le traitement de $it vers $dest
done
> $OPTARG ne contient que fichier1.txt, comme si fichier2.txt, n’était pas
> analysé par getopts
parce que getopt a été écrit pour écrire des commandes unix
si tu veux écrire un truc dans le style de ffmpeg ou convert (avec des
multiples in et out), tu dois gérer tes tableaux à la main (je te déconseille
dash pour ça, utilise mksh ou zsh).
version zsh:
input=()
output=()
set -- -i a b c -o A B C -i d
while (( $# )) {
case "${1:-}"
in (--) shift; break
;; (-o | --output ) to=output ; shift
;; (-i | --input ) to=input ; shift
;; (*) case "$to"
in (input) input+="$1" ; shift
;; (output) output+="$1" ; shift
;; (*) ……
esac
esac
}
echo input: $input
echo output: $output
mais comme je le disais au début: je pense que c'est une mauvaise idée.
si tu nous explique ce que fait ton script, on pourrait peut-être t'aider mieux?
cordialement,
--
Marc Chantreux
Pôle CESAR (Calcul et services avancés à la recherche)
Université de Strasbourg
14 rue René Descartes,
BP 80010, 67084 STRASBOURG CEDEX
03.68.85.60.79
Reply to: