shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Alternativa ao comando set usando read


From: Julio C. Neves
Subject: Re: [shell-script] Alternativa ao comando set usando read
Date: Tue, 13 Nov 2018 10:04:13 -0200

Olá Robson,
o ksh é o Shell default do UNIX, mas seu desenvolvimento é muito lento e por isso acho que o bash está bem à sua frente em qualidade e segurança.

Mas veja: vc pode usar o cmd set para passar os dados do BASH_REMATCH para variáveis posicionais. É bem simples:
$ a=(a 'b c' d)
$ set "${a[@]}"
$ echo $1
a
$ echo $2
b c
$ echo $3
d

Vou aproveitar para passar para a lista uma curiosidade sobre a solução que vc apresentou qdo postou a sua dúvida. Nela vc fez:
set -- "${BASH_REMATCH[@]}"
Esse -- que vc usou não está errado mas tb não tem finalidade. Isso é usado para dizer ao Shell que a partir desse ponto não tem mais opção, só tem parâmetro.

Para vc entender, primeiro vou te explicar o seguinte: o cmd find tem uma opção pouco conhecida que é muito semelhante ao -exec, só que antes dele executar o cmd associado, ele pergunta se vc quer mesmo executar aquele cmd.

Então, se eu quiser saber quais arquivos do meu diretório usam a opção -ok eu faço:
$ grep -F '-ok' *
grep: opção -- 'k' inválida
Uso: grep [OPÇÃO]... PADRÃO [ARQUIVO]...
Experimente "grep --help" para mais informações.

Mas se eu fizer:

$ grep -F -- '-ok' *

Ele entenderá o -F como uma opção e o -- encerrará as opções.

Um teste fácil de fazer. Execute:

> -sdemais
rm -sdemais

ZEBRA!!!! Só funcionará se vc fizer:

rm -- -sdemais
ou
rm ./-sdemais

Esses são os tipos de pulos do gato que vc não encontra em nenhum curso ou publicação.

Abraços,
Julio

» Não tem tempo para fazer um curso presencial?
» Na sua cidade não tem nenhum bom curso de Linux?
» Conheça nosso portal educacional e estude conosco: 



Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.



Em ter, 13 de nov de 2018 às 01:52, Robson Alexandre address@hidden [shell-script] <address@hidden> escreveu:
 

Mestre Júlio,

        tô fazendo isso tudo no bash. Eu ainda vou aprender esse ksh pois já vi várias pessoas falando muito bem deste shell.
        Realmente, eu acabei fazendo uma salada usando o set desnecessariamente, pois buscava uma maneira do read ler as posições do array. Como bem disseram, só manipulando o IFS.
if [[ "$texto" =~ ^(/[^@ ]+)(@[^ ]+)?\ ?(.*)? ]]; then
  primeiro=${BASH_REMATCH[1]}
  segundo=${BASH_REMATCH[2]}
  terceiro=${BASH_REMATCH[3]}
fi
        Não havia pensado nestas possibilidade que vc e o Itamar passaram. Um outro colega sugeriu a seguinte "gambiarra":
if [[ "$texto" =~ ^(/[^@ ]+)(@[^ ]+)?\ ?(.*)? ]]; then
  IFS='|' read match primeiro segundo terceiro < <(printf "%s|" "${BASH_REMATCH[@]}")
fi


Atenciosamente
Robson Alexandre



Em sex, 9 de nov de 2018 21:37, 'Julio C. Neves' address@hidden [shell-script] <address@hidden> escreveu:
 

Fala Robson,
se o seu Shell for bash e vc usar Here Strings (<<<) teu problema está resolvido, tipo read a b c <<< "1 2 3".
Se for ksh ou sh vc erá de fazer echo 1 2 3 | read a b c.

Mas no seu caso específico, para que isso? BASH_REMATCH já é uma variável do tipo vetor (array) cujo elemento índice 0 (zero) contem todo o casamento da ER e nos elementos seguintes, o que casou com cada um dos grupos (similar aos retrovisores)..

Vou aproveitar para fazer um marketing para o pessoal do RJ: a partir do dia 17 estarei dando um treinamento presencial de shell (em 40 horas) no RJ (no Centro) em 4 sábados. Como ainda sobraram umas poucas vagas e já está quase na hora, o Paulo Henrique (da Escola Linux), que está promovendo o curso me pediu para avisá-los que fará uma redução substancial no preço. Entre em contato com ele via address@hidden.

Se vc mora em outro local, a Livra-TE (Tecnologia & Educação em Sw Livre) + Dicas-l oferecerá um belíssimo desconto (50%++) em cursos referentes a Shell em ensino à distancia. Veja os cursos em: www.dicas-l.com.br/educacao.

Abraços,
Julio

» Não tem tempo para fazer um curso presencial?
» Na sua cidade não tem nenhum bom curso de Linux?
» Conheça nosso portal educacional e estude conosco: 



Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.



Em sex, 9 de nov de 2018 às 13:48, Robson Alexandre address@hidden [shell-script] <address@hidden> escreveu:
 

Boa tarde shelleiros,

    gostaria de saber se há alguma alternativa ao comando set usando o read, por exemplo, para atribuir valores a variáveis.
Meu código segue abaixo:
[[ "$texto" =~ ^(/[^@ ]+)(@[^ ]+)?\ ?(.*)? ]] && {
  set -- "${BASH_REMATCH[@]}"
  var1=$2
  var2=$3
  var3=$4
}
Minha dúvida é se há alguma alternativa para atribuição das variáveis usando read, como por exemplo:
array=('a' 'b c' 'd' 'e')
read var1 var2 var3 var4 < "${array[@]}"

Atenciosamente,

Robson Alexandre

--
Atenciosamente

Robson Alexandre


reply via email to

[Prev in Thread] Current Thread [Next in Thread]