Bouclage à travers un tableau de shell donné en paramètre

J'essaie d'écrire un petit script d'aide qui va changer les permissions et la propriété de certains sites sur un server.

En ce moment, je peux soit passer sur un site, soit faire tout simplement en sautant cet argument.

Ce que je trouve est que j'ai besoin de pouvoir appliquer à plusieurs sites sur le server, mais pas tous, alors j'ai essayé de faire une tentative de passer un tableau via:

SLIST=("my.site.com" "your.site.com") ./website-perms 644 755 kevin "${SLIST[@]}" 

Cependant, il ne fait que le premier élément du tableau my.site.com

Comment puis-je résoudre ceci afin que je puisse passer dans un tableau de sites?

CODE complet

 #!/bin/bash # Done nightly, and copyd to /usr/bin/ if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" 1>&2 exit 1 fi if [ $# -eq 0 ]; then echo "usage: ./website-perms.sh fileperm folderperm owner (1|2) (1=kevin,2=www-data) (optional) Site Array" exit 1 fi function chg_perms() { echo "find $1 -type f -exec chmod $2 {} \\"; echo "find $1 -type d -exec chmod $3 {} \\"; find $1 -type f -exec chmod $2 {} \; find $1 -type d -exec chmod $3 {} \; echo "-- chg_perms done"; } function chg_owner() { echo "chown -R $2:www-data $1"; chown -R $2:www-data $1; echo "-- chg_owner done"; } SITES=$4; if [ -z $SITES ]; then for dir in /var/www/httpdocs/*/ do dir=${dir%*/} chg_perms "/var/www/httpdocs/${dir##*/}" $1 $2 chg_owner "/var/www/httpdocs/${dir##*/}" $3 done; else for dir in "${SITES[@]}" #ONLY DOES THE FIRST ITEM do chg_perms "/var/www/httpdocs/$dir" $1 $2 chg_owner "/var/www/httpdocs/$dir" $3 done fi; 

Beau script. Habituellement, j'utiliserais tous les arguments restants comme la list des sites. Quelque chose comme ça (je n'ai pas testé ces mods):

 if [ $# -lt 3 ]; then echo >&2 "usage: $0 fileperm folderperm owner [site ...]" exit 1 fi 

[. . . ]

 fileperm="$1" folderperm="$2" owner="$3" shift 3 # shift first 3 args off of list if [ $# -eq 0 ]; then for dir in /var/www/httpdocs/*/ #stackexchange syntax coloring fix*/ do dir="${dir%/*}" chg_perms "/var/www/httpdocs/${dir##*/}" "$fileperm" "$folderperm" chg_owner "/var/www/httpdocs/${dir##*/}" "$owner" done; else for dir # step through positional args ($1,$2,...,$N) do chg_perms "/var/www/httpdocs/$dir" "$fileperm" "$folderperm" chg_owner "/var/www/httpdocs/$dir" "$owner" done fi 

Une prise légèrement différente, même si je préfère l'approche de RobertL

 sites=( "${@:4}" ) # ... for dir in "${sites[@]}"; do ... 
  • Pour déclarer un tableau, vous devez utiliser des parenthèses.
  • "${@:4}" prend les parameters de position, à partir de $ 4 jusqu'à la fin.
  • sortez de l'habitude d'utiliser ALLCAPSVARNAMES: laissez-les être restreints pour l'usage du shell seulement.