Um script de shell com um loop for e um “array”

1

Como posso usar este script sh com loop e um "array". Gostaria de chamar os domínios com um for loop dentro do if . Exemplo:

for domain in $DOMAINS
do
  printf '%s\n' "$domain"
done

Então, se você adicionar isso, então o printf deve ser como o que? Por exemplo, o wlstop gostaria de ser chamado onde o printf está com wls wlstop $domain .

#!/usr/bin/sh

ENV=$1
DOMAINS="1 2 3"

wls (){
    echo "$0 : $1 -v -d $2" 
    $1 -v -d $2
}

remove (){
    echo "$0 : Removing /domains/$1/servers/*" 
    set -x
    rm -rf /domains/$1/servers/*
    set +x
}

echo "$0 : Running wlsfullclean for $ENV"

if [ "$ENV" = "Utv" ]; then

    #Stop domain
    wls wlsstop 1   
    wls wlsstop 2
    wls wlsstop 3

    #Remove content in servers folder
    remove 1
    remove 2
    remove 3

    #wlsclean
    wls wlsclean 1
    wls wlsclean 2
    wls wlsclean 3

    #wlscfi
    wls wlscfi 1
    wls wlscfi 2
    wls wlscfi 3

    #Start server
    wls wlsstart 1
    wls wlsstart 2
    wls wlsstart 3

elif [ "$ENVI" = "Prod" ]; then
    echo "Prod"
fi
    
por user1423277 28.10.2015 / 16:14

1 resposta

3

if    [ Utv = "$ENV" ]
then  for  domain in 1 2 3
      do   for   wls in  stop clean cfi start
           do    wls wls"$wls" "$domain"
                 [ stop != "$wls" ] ||
                 remove "$domain"
           done
      done
fi

O campo in ... é uma atribuição de matriz. Você atribui os iteradores do loop lá. Você pode usar uma matriz predefinida ou pode simplesmente criar uma em como eu faço aqui. Realmente não faz sentido se dar ao trabalho de atribuir alguma variável de shell com o único propósito de designar uma matriz de for loop - é o dobro do trabalho e não é tão fácil de acompanhar. Essa é apenas minha opinião, claro.

De qualquer forma, o campo in ... é realmente opcional, porque existe uma matriz predefinida que o loop for utilizará como padrão - a matriz arg do shell. É por esse motivo que acredito que esse tipo de coisa faz mais sentido em uma função shell.

 wls_lp(){
     for  wls  in     stop clean cfi start
     do   for  domain
          do          set -x -- "-${-:--}" ${-:+"--"} "$@"
                      wls "wls$wls"  "$domain"
                      [ stop != "$wls" ] ||
                      remove "$domain"
                      { set +x "$@"; } 2>/dev/null
     done;done 
}

Se você colocar essa função em seu script, basta executar o loop inteiro em uma lista de domínios como:

if     [ Utv = "$ENV" ] 
then   wls_lp domain1 domain2 domain3
fi
    
por 28.10.2015 / 16:49