The UNIX and Linux Forums  
Hallo en welkom van de Verenigde Staten aan de UNIX en Linux Forum! Bedankt voor uw bezoek en Deelnemen aan onze wereldwijde gemeenschap.

Go Back   De Unix-en Linux Forum > Top Forums > Programmeren en Shell Scripting
.
google unix.com



Programmeren en Shell Scripting Post vragen over KSH, CSH, SH, Bash, Perl, PHP, sed, awk en andere shell scripts en shell scripting talen hier.

Meer UNIX en Linux Forum Onderwerpen Misschien vindt u Helpful
Draad Thread Starter Forum Antwoorden Last Post
bash - uitstel uitbreiding van de variabele scandora Programmeren en Shell Scripting 3 02-18-2009 05:59
globbing, $ # te hoog is na wildcard expansie in bash-script zoo591 Programmeren en Shell Scripting 3 07-25-2008 03:50
Patroon uitbreiding probleem njoshi Programmeren en Shell Scripting 5 04-24-2007 01:28 PM
AIX Expansion CD almuwatta AIX 0 06-23-2005 06:07 PM
ksh op HP-UX - variabele expansie dangral UNIX voor Dummies Questions & Answers 4 02-08-2005 12:35

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 Zoeken in deze Thread Rate Thread Display Modes
  #1 (permalink)  
Old 07-02-2009
mglenney mglenney is offline
Geregistreerde gebruiker
  
 

Join Date: juni 2009
Posts: 85
Brace expansie probleem in Bash

Ik heb een script dat is een optie voor server zwembaden het script tegen. De optie is als een komma gescheiden lijst (dwz,-p 201.204.301).

Ik gebruik eval en brace expansie te krijgen die pool nummers in een array. Het werkt prima, tenzij slechts 1 zwembad is vermeld. Hier is de code:

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

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
+ '[' '' '!=' '' ']'
Als enkele pool gegeven:

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
+ '[' '' '!=' '' ']'
Dus als een zwembad is het verlaten van de bretels eromheen dat is slecht. Ik kon wel een test van $ 1 om te zien of er een komma en ze anders zijn indien er niet, maar ik vroeg me af of er een betere oplossing dan dat. Ook me af of hoe ik behandeld om het zwembad nummers in een array is de beste manier om dit te doen (eval & brace expansie).

Bedankt,

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

Join Date: Feb 2005
Locatie: Boston, MA
Berichten: 5.122
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
Geregistreerde gebruiker
  
 

Join Date: juni 2009
Posts: 85
Citaat:
Oorspronkelijk geplaatst door 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;
Ik gebruik Bash dat niet hebben-Een optie voor het instellen en, van wat ik kan vertellen, heeft geen equivalent. Ik wil het hebben, omdat je in principe doen wat ik nodig heb in een enkele regel met uw voorbeeld.

Voor nu heb ik mijn probleem opgelost deze manier:

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  
Moderator
  
 

Join Date: Feb 2005
Locatie: Boston, MA
Berichten: 5.122
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
Geregistreerde gebruiker
  
 

Join Date: juni 2009
Posts: 85
Perfect. Ik was zo opgehangen op te lossen door gebruik te maken van brace expansie.

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

Join Datum: maart 2007
Plaats: Toronto, Canada
Berichten: 2.361
Citaat:
Oorspronkelijk geplaatst door 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;

Alle bovenstaande is gelijk aan:

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

Bladwijzers

Thread Tools Zoeken in deze Thread
Zoeken in deze Thread:

Uitgebreid zoeken
Display Modes Beoordeel deze draad
Beoordeel deze draad:

Posting Regels
Jij mag niet Post Nieuwe threads
Jij mag niet na antwoorden
Jij mag niet post attachments
Jij mag niet bewerk uw berichten

BB code is Aan
Smilies zijn Aan
[IMG] code Aan
HTML-code is Uit
Trackbacks zijn Aan
Pingbacks zijn Aan
Refbacks zijn Aan




Alle tijden zijn GMT -4. Het is nu 05:05 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Vertalingen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
De Unix-en Linux Forums Copyright © 1993-2009. Alle rechten Reserved.Ad Beheer door RedTyger

Content Relevante URL's door vBSEO 3.2.0