From 9fe17b35933b40818d501ac3c41a80e80eaeee29 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 7 Jun 2016 02:06:59 +0400 Subject: [PATCH] Ajouter le script foreach --- foreach | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100755 foreach diff --git a/foreach b/foreach new file mode 100755 index 0000000..d36ab60 --- /dev/null +++ b/foreach @@ -0,0 +1,74 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +source "$(dirname "$0")/lib/ulib/ulib" || exit 1 +urequire DEFAULTS + +function display_help() { + uecho "$scriptname: lancer une commande pour un ensemble d'arguments + +USAGE + $scriptname [options] [VAR=]expr cmd... + +La commande est lancée avec la variable 'VAR', qui vaut par défaut 'item', +définie à la valeur courante de l'énumération. De plus, la variable 'index' +reçoit une valeur incrémentale commençant à 0. + +Exemple: + $scriptname '*.c' 'cp $item to/another/dir' + +OPTIONS + -b, --basedir BASEDIR + Chercher les expressions -d, -g, -f, -a à partir de BASEDIR au lieu du + répertoire courant. + -d, --dir + Faire la correspondance de l'expression sur les répertoires + -g, --go + Comme -d, mais pour chaque répertoire, lancer la commande après en avoir + fait le répertoire courant. + -f, --file + Faire la correspondance de l'expression sur les répertoires + -a, --all + Faire la correspondance de l'expression sur les répertoires + -s, --string + Evaluer la chaine avec le shell" +} + +basedir= +match=all +changedir= +args=(+ + --help '$exit_with display_help' + -b:,--basedir: basedir= + -d,--dir match=dir + -g,--go '$match=dir; changedir=1' + -f,-file match=file + -a,--all match=all + -s,--string match=string +) +parse_args "$@"; set -- "${args[@]}" + +varexpr="$1"; shift +splitfsep2 "$varexpr" = varname expr +[ -n "$varname" ] || varname=item +[ -n "$expr" ] || expr="*" + +cmd=("$@") +[ ${#cmd[*]} -gt 0 ] || cmd=('echo $item') + +[ -n "$basedir" ] || basedir=. + +case "$match" in + all) array_lsall items "$basedir" "$expr";; + dir) array_lsdirs items "$basedir" "$expr";; + file) array_lsfiles items "$basedir" "$expr";; + string) eval "items=($expr)";; +esac + +let index=0 +for item in "${items[@]}"; do + ( + [ -n "$changedir" ] && cd "$item" + eval "export $(echo_setv "$varname" "$item"); ${cmd[*]}" + ) + let index=$index+1 +done