The UNIX and Linux Forums  

Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com



Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
bash - fördröja utbyggnaden av variabel scandora Shell-programmering och Skript 3 02-18-2009 05:59
globbing, $ # är för hög efter wildcard expansion i bash script zoo591 Shell-programmering och Skript 3 07-25-2008 03:50
Mönster expansion problem njoshi Shell-programmering och Skript 5 04-24-2007 01:28
AIX Expansion CD almuwatta AIX 0 06-23-2005 06:07
ksh om HP-UX - variabel expansion dangral UNIX for Dummies Frågor & Svar 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 Sök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 07-02-2009
mglenney mglenney is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 85
Brace expansion problem i Bash

Jag har ett script som tar en alternativ för-pooler för att köra skript emot. Alternativet ges som en kommaseparerad lista (dvs.-p 201.204.301).

Jag använder eval och stag expansion för att få dem pool nummer i en matris. Det fungerar bra om inte bara 1 pool angivits. Här är koden:


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

Om flera pooler ges:


Kod:
[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
+ '[' '' '!=' '' ']'

Om enda pool ges:


Kod:
[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å om en enda pool finns det lämnar klammerparenteserna runt det som är dåligt. Jag kunde göra ett test på $ 1 för att se om det finns några kommatecken och behandla det annorlunda om det inte men jag undrar om det finns en bättre lösning än så. Dessutom undrar om hur jag hanterade få poolen siffror i en rad var det bästa sättet att göra det (eval & stag expansion).

Tack,

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

Join Date: februari 2005
Ort: Boston, MA
Inlägg: 5.131

Kod:
#!/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 (permalänk)  
Old 07-02-2009
mglenney mglenney is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 85
Citat:
Ursprungligen postat av vgersh99 View Post
Kod:
#!/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;
Jag använder Bash som inte har-Ett alternativ för uppsättning och, från vad jag kan säga, inte har en motsvarande. Jag önskar att det gjorde, eftersom du i princip göra vad jag behöver i en enda rad med ditt exempel.

För nu har jag löst mitt problem på detta sätt:


Kod:
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 (permalänk)  
Old 07-02-2009
vgersh99's Avatar
vgersh99 vgersh99 is offline Forum Staff  
Moderator
  
 

Join Date: februari 2005
Ort: Boston, MA
Inlägg: 5.131

Kod:
#!/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 (permalänk)  
Old 07-02-2009
mglenney mglenney is offline
Registered User
  
 

Join Date: juni 2009
Inlägg: 85
Perfekt. Jag var så hängas upp på att lösa det med hjälp av stag expansion.

Tack!
  #6 (permalänk)  
Old 07-03-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmerare, författare
  
 

Join Date: mars 2007
Ort: Toronto, Kanada
Inlägg: 2.380
Citat:
Ursprungligen postat av vgersh99 View Post
Kod:
#!/bin/bash

list='201,204,301'

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

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

Alla ovanstående motsvarar:


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

Reply

Komihåglista

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 06:02.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0