The UNIX and Linux Forums  


Go Back   O UNIX e Linux Forum > Top Fóruns > Programação Shell Script e
.
google unix.com



Programação Shell Script e Post perguntas sobre ksh, CSH, SH, BASH, Perl, PHP, SED, Awk e outros scripts shell e shell scripts línguas aqui.

Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
Fio Thread Starter Fórum Respostas Última postagem
bash - retardar expansão da variável scandora Programação Shell Script e 3 02-18-2009 05:59
globbing, $ # é demasiado elevado após curinga expansão em bash script zoo591 Programação Shell Script e 3 07-25-2008 03:50
Padrão expansão problema njoshi Programação Shell Script e 5 04-24-2007 01:28
AIX Expansão CD almuwatta AIX 0 06-23-2005 06:07
ksh no HP-UX - variável expansão dangral UNIX para Dummies Perguntas & Respostas 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 Pesquisar este Thread Rate Thread Display Modes
  #1 (permalink)  
Old 07-02-2009
mglenney mglenney is offline
Usuário
  
 

Join Date: Jun 2009
Lugares: 85
Brace expansão problema no Bash

Eu tenho um script que tem uma opção para servidor piscinas para executar o script contra. A opção é dado como uma lista separada por vírgulas (ou seja, p-201204301).

Estou usando o eval e expansão braçadeira para obter os números de piscina em um array. Ele trabalha bem menos que apenas 1 piscina número é dado. Aqui está o código:


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

Se várias piscinas dado:


Código:
[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
+ '[' '' '!=' '' ']'

Se único agrupamento indicados:


Código:
[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
+ '[' '' '!=' '' ']'

Portanto, se um único agrupamento é dado deixa as chavetas à volta dela, que é ruim. Eu poderia fazer um teste de US $ 1 para ver se há qualquer vírgulas e processá-lo diferente, caso não existam, mas eu estava me perguntando se há uma solução melhor do que isso. Também me perguntava se eu tratadas como obter os números de piscina em um array foi a melhor maneira de fazê-lo (eval & braçadeira expansão).

Obrigado,

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

Join Date: Feb 2005
Localização: Boston, MA
Mensagens: 5.131

Código:
#!/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
Usuário
  
 

Join Date: Jun 2009
Lugares: 85
Citação:
Originally Posted by vgersh99 View Post
Código:
#!/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;
Estou usando o Bash que não tem opção para configurar-A e, a partir do que eu posso dizer, não tem um equivalente. Eu gostaria que você fez, porque basicamente o que eu preciso fazer em uma única linha com o seu exemplo.

Por agora tenho o meu problema resolvido desta maneira:


Código:
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  
Moderador
  
 

Join Date: Feb 2005
Localização: Boston, MA
Mensagens: 5.131

Código:
#!/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
Usuário
  
 

Join Date: Jun 2009
Lugares: 85
Perfeito. Eu estava tão desligou em resolvê-lo usando cinta expansão.

Obrigado!
  #6 (permalink)  
Old 07-03-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programador, autor
  
 

Join Date: Mar 2007
Localização: Toronto, Canadá
Posts: 2.365
Citação:
Originally Posted by vgersh99 View Post
Código:
#!/bin/bash

list='201,204,301'

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

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

Todas as alternativas acima é equivalente a:


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

Reply

Marcadores

Thread Tools Pesquisar este Thread
Pesquisar este Thread:

Pesquisa Avançada
Display Modes Esta taxa Thread
Esta taxa Thread:

Destacamento Regimento
Você não pode postar novas threads
Você não pode postar respostas
Você não pode postar anexos
Você não pode editar suas postagens

BB code é Ligado
Smilies são Ligado
[IMG] código é Ligado
Código HTML é Desligado
Trackbacks são Ligado
Pingbacks são Ligado
Refbacks são Ligado




Todos os horários são GMT -4. A hora é agora 04:02.


Powered by: vBulletinCopyright © 2000 - 2006, Jelsoft Enterprises Limited. Língua Traduções Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
O UNIX e Linux Fóruns Content Copyright © 1993-2009. Todos os Direitos Reserved.Ad Gestão por RedTyger

Content Relevant URLs por vBSEO 3.2.0