nutools/foreach

75 lines
2.0 KiB
Plaintext
Raw Normal View History

2016-06-07 02:06:59 +04:00
#!/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