The UNIX and Linux Forums  

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > De programmation et de script Shell
.
google unix.com



De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici.

Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
Fil Thread Starter Forum Réponses Last Post
bash - retarder l'expansion de la variable scandora De programmation et de script Shell 3 02-18-2009 05:59 AM
globbing, $ # est trop élevé après wildcard expansion dans script bash zoo591 De programmation et de script Shell 3 07-25-2008 03:50 AM
Pattern expansion problème njoshi De programmation et de script Shell 5 04-24-2007 01:28 PM
AIX Expansion CD almuwatta AIX 0 06-23-2005 06:07 PM
ksh sous HP-UX - variable expansion dangral UNIX pour les nuls Questions et réponses 4 02-08-2005 12:35 PM

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 07-02-2009
mglenney mglenney is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 85
Brace expansion problème de Bash

J'ai un script qui prend une option pour les piscines de serveur pour exécuter le script contre. La possibilité est donnée comme une liste séparée par une virgule (c'est-à-dire, p-201.204.301).

J'utilise eval brace expansion et d'obtenir les numéros de la piscine dans un tableau. Cela fonctionne très bien, sauf si seulement 1 piscine numéro est donné. Voici le code:


Code:
while [ "$1" != "" ]; do
  case $1 in
    -p  )               shift
                        pools=($(for i in $(eval echo {$1}); do echo $i; done | sort))
                        ;;

Si plusieurs piscines donnée:


Code:
[me@server bin]$ ./project_nunenhoffen.sh -p 201,202
+ '[' -p '!=' '' ']'
+ case $1 in
+ shift
+ pools=($(for i in $(eval echo {$1}); do echo $i; done | sort))
++ sort
+++ eval echo '{201,202}'
++++ echo 201 202
++ for i in '$(eval echo {$1})'
++ echo 201
++ for i in '$(eval echo {$1})'
++ echo 202
+ shift
+ '[' '' '!=' '' ']'

Si pool unique donnée:


Code:
[me@server bin]$ ./project_nunenhoffen.sh -p 201
+ '[' -p '!=' '' ']'
+ case $1 in
+ shift
+ pools=($(for i in $(eval echo {$1}); do echo $i; done | sort))
++ sort
+++ eval echo '{201}'
++++ echo '{201}'
++ for i in '$(eval echo {$1})'
++ echo '{201}'
+ shift
+ '[' '' '!=' '' ']'

Ainsi, si un pool unique est donné, il laisse les accolades autour d'elle qui est mauvais. Je pourrais faire un test de $ 1 pour voir si il ya des virgules et des processus différents, il n'y a pas si, mais je me demandais s'il ya une meilleure solution que cela. Aussi demande si je traitées obtenir les numéros de la piscine dans un tableau a été la meilleure façon de le faire (eval et brace expansion).

Merci,

Mike G.
  #2 (permalink)  
Old 07-02-2009
vgersh99's Avatar
vgersh99 vgersh99 is offline Forum Staff  
Modérateur
  
 

Join Date: Feb 2005
Lieu: Boston, MA
Posts: 5131

Code:
#!/bin/ksh

list='201,204,301'

IFS=,; set -A array ${list}

typeset -i i=0
while (( $i < ${#array[*]} ))
do
  echo "${array[$i]}"
  ((i=i+1))
done;

  #3 (permalink)  
Old 07-02-2009
mglenney mglenney is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 85
Citation:
Posté par vgersh99 View Post
Code:
#!/bin/ksh

list='201,204,301'

IFS=,; set -A array ${list}

typeset -i i=0
while (( $i < ${#array[*]} ))
do
  echo "${array[$i]}"
  ((i=i+1))
done;
J'utilise Bash qui ne dispose pas d'option-A pour la fixer et, de ce que je peux le dire, n'a pas d'équivalent. Je souhaite, car elle ne vous y faire ce que j'ai besoin dans une seule ligne, avec votre exemple.

Pour l'instant, j'ai résolu mon problème de cette façon:


Code:
while [ "$1" != "" ]; do
  case $1 in
    -p  )               shift
                        case $1 in
                          *,* ) pools=( $(for i in $(eval echo {$1}); do echo $i; done | sort) ) ;;
                          *   ) pools=$1 ;;
                        esac
                        ;;

  #4 (permalink)  
Old 07-02-2009
vgersh99's Avatar
vgersh99 vgersh99 is offline Forum Staff  
Modérateur
  
 

Join Date: Feb 2005
Lieu: Boston, MA
Posts: 5131

Code:
#!/bin/bash

list='201,204,301'

IFS=,; array=(${list})

typeset -i i=0
while (( $i < ${#array[*]} ))
do
  echo "${array[$i]}"
  ((i=i+1))
done;

  #5 (permalink)  
Old 07-02-2009
mglenney mglenney is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 85
Perfect. J'étais tellement accroché à résoudre à l'aide de l'expansion des accolades.

Merci!
  #6 (permalink)  
Old 07-03-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmeur, auteur
  
 

Join Date: Mar 2007
Lieu: Toronto, Canada
Messages: 2378
Citation:
Posté par vgersh99 View Post
Code:
#!/bin/bash

list='201,204,301'

IFS=,; array=(${list})

typeset -i i=0
while (( $i < ${#array[*]} ))
do
  echo "${array[$i]}"
  ((i=i+1))
done;

Tous les ci-dessus est équivalent à:


Code:
list='201,204,301'
array=( ${list//,/ } )
printf "%s\n" "${array[@]}"

Reply

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 08:12 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0