dash: parse string em duas variáveis

3

Eu tenho um script de traço e preciso analisar $1 , que é uma string contendo duas partes separadas por ' : ', como foo:123 . Gostaria de salvar foo em $ X e 123 em $ Y.

Eu achei que poderia usar read :

$ echo "foo:123" | tr ':' ' ' | read X Y

mas isso não funciona (nenhum erro é dado)

$ echo $X

fornece uma linha vazia como saída.

Por que minha construção read não funciona? E como eu poderia alcançar meu objetivo (qualquer solução, não tem que usar leitura)

    
por Martin Vegter 26.04.2015 / 21:29

2 respostas

6

Em traço , cada comando em Pipelines executar em subshell ( zsh e AT & T ksh , o comando mais à direita em pipelines doesn 't ), então as variáveis X e Y não existem mais quando o comando é feito.

Simplesmente, você pode usar Expansão de Parâmetros , tente:

$ set -- foo:123
$ X=${1%:*}
$ Y=${1#*:}

O exemplo é usado para sessões interativas.

Dentro do seu script, você não precisa de set -- foo:123 .

    
por 26.04.2015 / 21:38
4

Você também pode usar o operador split + glob (deixar uma variável sem aspas) (e que você usou sem motivo aparente na sua pergunta):

IFS=:     # configure the split part to use : as the delimiter
set -f    # disable the glob part
set -- $1 # $1 is split on : and parts are stored in $1, $2...
X=$1 Y=$2

Você também pode fazer:

printf '%s\n' "$1" | {
  IFS=: read -r X Y
  printf '%s\n' "$X"
}

Em dash como bash (mas contrário a AT & T ksh ou zsh ), todas as partes de um pipeline são executadas em subshells (elas precisam ser executadas em processos diferentes de qualquer maneira, desde que executadas simultaneamente). Acima, precisamos que a parte que usa $X esteja nessa sub-sela que lê a saída de printf e define $X .

Observe que essas duas soluções se comportam de maneira diferente se $1 contiver um caractere de nova linha ou mais de um caractere : .

    
por 27.04.2015 / 00:26