Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/01/2008, à 22:32

jak0lantash

[RESOLU][bash] Tableau de chaine en parametre d'une fonction

Bonjour,

Je suis un peu un noob en shell script, et j'aurai besoin de votre aide pour un truc tout simple je pense.
J'ai cherché dans plein plein d'endroit sur le net, mais j'arrive pas à  trouver ma réponse.
Si vous pouviez m'aider...

Le problème est simple. J'ai un tableau composé de deux chaines de caractères :

services_apache={[0]="\"/etc/init.d/apache2 stop\"" [1]="/etc/init.d/apache2 start"}

Je cache pas ce que je veux faire avec, j'ai donc laissé les chaines d'origine. Vous avez sans doute remarquez que les deux éléments étaient pas formattés pareil, c'est juste pour montrer que le résultat est le même (que ça ne marche pas comme prévu ^^)...

Je souhaiterai passer ce tableau en paramètre à  une fonction, et que cette fonction reçoive bien un tableau avec les deux chaines (correctement) séparées. Mais j'y arrive pas. Dans la fonction, j'ai toujours les 4 chaines séparées ("/etc/init.d/apache2" "stop" "/etc/init.d/apache2" "start") !! et des fois j'ai même que les 2 premières. Please Help.

Voici mon code (de test) :

Je définie ensuite la fonction :

testparams() {
  for arg in "$@"
  do
    echo "arg quote at $arg"
  done
  for arg in $@
  do
    echo "arg $arg"
  done
  for arg in "$*"
  do
    echo "arg quote star $arg"
  done
  for arg in $*
  do
    echo "arg star $arg"
  done
}

Et enfin, j'appel :

echo "--- service_apache[at] ---"
testparams ${services_apache[@]}
echo ""
echo "--- service_apache[star] ---"
testparams ${services_apache[*]}
echo ""
echo "--- service_apache ---"
testparams ${services_apache}

Voici mon résultat :

--- service_apache[at] ---
arg quote at "/etc/init.d/apache2
arg quote at stop"
arg quote at /etc/init.d/apache2
arg quote at start
arg "/etc/init.d/apache2
arg stop"
arg /etc/init.d/apache2
arg start
arg quote star "/etc/init.d/apache2 stop" /etc/init.d/apache2 start
arg star "/etc/init.d/apache2
arg star stop"
arg star /etc/init.d/apache2
arg star start

--- service_apache[star] ---
arg quote at "/etc/init.d/apache2
arg quote at stop"
arg quote at /etc/init.d/apache2
arg quote at start
arg "/etc/init.d/apache2
arg stop"
arg /etc/init.d/apache2
arg start
arg quote star "/etc/init.d/apache2 stop" /etc/init.d/apache2 start
arg star "/etc/init.d/apache2
arg star stop"
arg star /etc/init.d/apache2
arg star start

--- service_apache ---
arg quote at "/etc/init.d/apache2
arg quote at stop"
arg "/etc/init.d/apache2
arg stop"
arg quote star "/etc/init.d/apache2 stop"
arg star "/etc/init.d/apache2
arg star stop"

Merci pour vous réponses ou pistes...

Dernière modification par jak0lantash (Le 09/07/2008, à 23:40)

Hors ligne

#2 Le 17/01/2008, à 22:55

Alain.g

Re : [RESOLU][bash] Tableau de chaine en parametre d'une fonction

Salut

Il bien utiliser @ mais également protéger ${services_apache[@]} par des guillemets :

#!/bin/bash
services_apache=( "/etc/init.d/apache2 stop" "/etc/init.d/apache2 start" )

testparams() {
  for arg in "$@"
  do
    echo "arg quote at $arg"
  done
}

testparams "${services_apache[@]}"

ou alors changer la valeur d'IFS, ce qui permettrait de se passer des guillemets et de choisir * ou @

#!/bin/bash
IFS=$'\n'
services_apache=( /etc/init.d/apache2\ stop /etc/init.d/apache2\ start )

testparams() {
  for arg in $*
  do
    echo arg star $arg
  done
}

testparams ${services_apache[*]}
#!/bin/bash
IFS=$'\n'
services_apache=( /etc/init.d/apache2\ stop /etc/init.d/apache2\ start )

testparams() {
  for arg in $@
  do
    echo arg at $arg
  done
}

testparams ${services_apache[@]}

Dernière modification par Alain.g (Le 17/01/2008, à 23:07)


Xubuntu Karmic !

Hors ligne

#3 Le 17/01/2008, à 23:05

jak0lantash

Re : [RESOLU][bash] Tableau de chaine en parametre d'une fonction

Merci pour ta réponse rapide... et correcte !
C'est parfait, merci beaucoup. Je vais pouvoir reprendre la suite du script. Merci merci merci ^^

Hors ligne