[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: