The UNIX and Linux Forums  
Hej og Velkommen fra USA til UNIX og Linux Forums! Tak for dit besøg og deltager i vores globale samfund.

Go Back   UNIX og Linux Forums > Top Forums > Shell Programmering og Scripting
.
google unix.com



Shell Programmering og Scripting Post spørgsmål om ksh, CSH, SH, Bash, Perl, PHP, SED, AWK og ANDRE shell scripts og Shell scriptsprog her.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
bash - forsinke udvidelsen af variable scandora Shell Programmering og Scripting 3 02-18-2009 05:59 AM
globbing, $ # er for høj efter wildcard ekspansion i bash script zoo591 Shell Programmering og Scripting 3 07-25-2008 02:50 AM
Mønster ekspansion problem njoshi Shell Programmering og Scripting 5 04-24-2007 12:28 PM
AIX Expansion CD almuwatta AIX 0 06-23-2005 05:07 PM
ksh på HP-UX - variabel ekspansion dangral UNIX for dummyer Spørgsmål & svar 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 Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 07-02-2009
mglenney mglenney is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 85
Tandbøjle ekspansion problem i Bash

Jeg har et script, der tager en mulighed for server puljer til at køre script imod. Indstillingen er givet som en kommasepareret liste (dvs.-p 201.204.301).

Jeg bruger eval og tandbøjle ekspansion for at få dem pool numre i et array. Det fungerer fint, medmindre kun 1 pool er angivet. Her er koden:

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

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
+ '[' '' '!=' '' ']'
Hvis én pulje givet:

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
+ '[' '' '!=' '' ']'
Så hvis en enkelt pool findes det forlader parenteser omkring det der er dårlig. Jeg kunne lave en test af $ 1 for at se, om der er nogen kommaer og behandle det anderledes, hvis der ikke er, men jeg tænkte, om der er en bedre løsning end det. Også tænkte, om hvordan jeg håndteres få puljen numre i et array var den bedste måde at gøre det (eval & tandbøjle ekspansion).

Tak,

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

Join Date: Feb 2005
Beliggenhed: Boston, MA
Indlæg: 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
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 85
Citat:
Oprindeligt Indsendt af 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;
Jeg bruger Bash som ikke har-A mulighed for at indstille og fra hvad jeg kan fortælle, ikke har en tilsvarende. Jeg ville ønske, det var, fordi du dybest set gøre, hvad jeg har brug for i en enkelt linje med dit eksempel.

For nu har jeg løst mit problem på denne måde:

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 online now Forum Staff  
Moderator
  
 

Join Date: Feb 2005
Beliggenhed: Boston, MA
Indlæg: 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
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 85
Perfekt. Jeg var så hængt op på at løse den ved hjælp tandbøjle ekspansion.

Tak!
  #6 (permalink)  
Old 07-03-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmør, forfatter
  
 

Join Date: Mar 2007
Beliggenhed: Toronto, Canada
Stillinger: 2361
Citat:
Oprindeligt Indsendt af 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 ovenstående svarer til:

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

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 08:17 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0