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

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

Re: [shell-script-pt] Usando while... do e If no mesmo pipe


From: Arkanon
Subject: Re: [shell-script-pt] Usando while... do e If no mesmo pipe
Date: Fri, 20 Nov 2020 10:08:55 -0300

"Eu nem tinha isso como objetivo profissional, e aos poucos o shell tem se mostrado mais eficiente e simples do que outras linguagens que tenho tentado aprender."

Não precisa dizer mais nada, George. Uma galera aqui (eu incluído!) já ganhou o dia só com esse reconhecimento de alguém que muito provavelmente está se entregando à cachaça que é a programação em shell script! :D

Em sex., 20 de nov. de 2020 às 09:47, George Robinson <george.robinson.br@gmail.com> escreveu:
Olá!

Gostaria de agradecer a todos pela grandiosa aula que recebi. Quanto à indentação do código, o que aconteceu é que eu já havia feito antes, porém, estava errado, então uni tudo e mandei o comando. Eu peço desculpas pela deselegância (isto sim é feio, se é pra escrever, vamos escrever direito!), porém, eu já estava há muitas horas batendo cabeça, e não sou nenhum pouco avançado no assunto e portanto, coisas elementares como elegância de código, reaproveitamento de um array, realmente eu acabei deixando feito e sujo.

Arkanon, Julio e Paulo,

Obrigado pelo sempre interesse em ajudar, e saibam que essas coisas mudam vidas. Eu nem tinha isso como objetivo profissional, e aos poucos o shell tem se mostrado mais eficiente e simples do que outras linguagens que tenho tentado aprender.

Mais uma vez, obrigado por isso!

Em sex., 20 de nov. de 2020 às 05:16, Arkanon <arkanon@lsd.org.br> escreveu:
Beleza, George?

Anote essa sugestão do Mestre Julio: apresente sempre seu código da forma mais legível possível. Vai ajudar não apenas os integrantes da lista a entenderem seu algoritmo, mas principalmente você, que provavelmente será o responsável pela manutenção futura dele :-)

Se eu copiei e colei corretamente o código original, identando-o segundo algum critério discutível chegamos a algo assim:

cat << EOT > myCompanyOutput.txt
2020-12-01,Guilherme,Rosa,08822812751,Gerente de Remuneração e Benefícios,Tecnologia da Informação,21976748288,guilherme_rosa@me.com,Jonas Fake,16000,myCompany
2020-12-08,George Robinson,da Silva Serejo Santos,10235233706,Analista de Suporte Sênior,Tecnologia da Informação,21974498138,george.robinson.br@gmail.com,Jonas Fake,16000,myCompany02
2020-12-15,Rosilene,Barbosa de Souza,11271238748,Analista de Marketing,Marketing,21966724094,rosilenebs30@gmail.com,Jonas Fake,16000,myCompany03
EOT

cat myCompanyOutput.txt \
| while IFS=, read hiringDate name last_name cpf cargo departamento telefone email gestorName salary empresa
  do
    if [[ $empresa == myCompany ]]
    then
      curl -s \
        -X POST \
        -H accept:application/json \
        -H token:f5ca4c9f-a530-48e5-ac8c-cf33cf5b74b1 \
        -d "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary" \
        https://public-api.convenia.com.br/api/v3/employees/admission \
      | if [[ $empresa == myCompany02 ]]
        then
          curl -s \
            -X POST \
            -H accept:application/json \
            -H token:7b541570-16eb-4468-a222-f7789e1cfff9 \
            -d "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary" \
            https://public-api.convenia.com.br/api/v3/employees/admission \
          | if [[ $empresa == myCompany03 ]]
            then
              curl -s \
                -X POST \
                -H accept:application/json \
                -H token:0337304e-1d8f-4252-8676-9eb73c28393e \
                -d "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary" \
                https://public-api.convenia.com.br/api/v3/employees/admission
            fi
        fi
    fi
  done


Já corrigi o erro de sintaxe apontado pelo Julio.
Também adicionei pequenas alterações na sintaxe dos comandos curl para deixá-los um pouco mais alinhados, mas nada que não funcionasse na sua versão original.

Achei um tanto estranho esse encadeamento de if curl com pipes. Não parece que vá funcionar, como podemos verificar executando o código. Você disse num outro email que já o corrigiu, talvez tenha trocado os pipes por ponto e vírgula, não sei.

Agora, assumindo que o que você tem no while são três testes para executar a chamada da api via curl conforme a empresa, cada uma com seu próprio token, deixo uma sugestão de código que parece ser equivalente e que detalho na sequência:

# 1
url="" href="https://public-api.convenia.com.br/api/v3/employees/admission" target="_blank">https://public-api.convenia.com.br/api/v3/employees/admission

# 2
declare -A token
token=(
          [myCompany]=f5ca4c9f-a530-48e5-ac8c-cf33cf5b74b1
        [myCompany02]=7b541570-16eb-4468-a222-f7789e1cfff9
        [myCompany03]=0337304e-1d8f-4252-8676-9eb73c28393e
      )

# 3
api() { echo -e "\n$1"; curl -s -X POST -H accept:application/json -H token:${token[$1]} -d "$2" $url; echo; }

# 4
while IFS=, read hiringDate name last_name cpf cargo departamento telefone email gestorName salary empresa
do
  api $empresa "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary"
done < myCompanyOutput.txt
  1. começamos armazenando a url da api em uma variável, já que ela é a mesma em todas as chamadas.
  2. se em cada laço do loop temos apenas uma empresa, cada uma com seu token, e para cada uma delas é feito um teste para chamar a api usando esse token, então, um array associativo onde os índices são os nomes das empresas apontando para seu respectivo token permite recuperar essa informação em cada laço do loop sem executar teste algum.
  3. como o Paulo bem observou na resposta dele, a única diferença entre as chamadas da api são os tokens. Isso sugere fortemente a substituição de todos os comandos curl por alguma função que abstraia tudo o que há em comum, passando como parâmetro apenas o que difere. Essa é a função da função api :-p Pode ver que ela recebe dois parâmetros: $1, com o token e $2, com os dados passados para a api rest propriamente dita. Aliás, pelo menos com esses dados que você passou, o parâmetro de header -H accept:application/json é desnecessário. A chamada funciona perfeitamente sem ele. Você pode muito bem usar a função:
    api() { echo -e "\n$1"; curl -s -X POST -H token:${token[$1]} -d "$2" $url; echo; }
  4. finalmente, iteramos sobre as linhas do arquivo myCompanyOutput.txt, em cada laço passando para a função api o nome da empresa (que será usado na função para recuperar o token armazenado no array associativo) e os dados montados para uso na chamada da api. Observe a forma como o arquivo é lido: ao invés de usar um cat criando um subshell para passar os dados via pipe, simplesmente é feito um redirecionamento do arquivo para o while. Mais simples e eficiente.
  5. alguém poderia sugerir que, uma vez que agora há apenas UM comando curl (o que está na função api), a variável $url poderia ser dispensada colocando seu valor diretamente na chamada do comando dentro da função. Bom, não é uma boa prática chumbar parâmetros, mesmo quando cumprem função de constantes ou aparecem apenas uma vez.
Executando o código, recebemos:

myCompany
{"message":"","data":[{"id":"468b3e42-0948-4c15-8a4c-f4a436813eaa","status":0,"employee":{"id":"debc67f9-8741-4dd8-ac49-b7029323fae9", ... ,"redirect":null,"success":true}

myCompany02
{"message":"","data":[{"id":"d614e833-410b-43ad-b9d9-88617898cb1e","status":0,"employee":{"id":"23f0fe3c-8afe-426b-b459-e62af809ad61", ... ,"redirect":null,"success":true}

myCompany03
{"message":"","data":[{"id":"35754717-7dc5-47d7-aa40-02bb8acb25ba","status":0,"employee":{"id":"64c2c8ea-324d-499a-ac0e-6e782c3b731e", ... ,"redirect":null,"success":true}

Parece correto, olhando o valor do campo success no json de retorno.

Att,

Em qui., 19 de nov. de 2020 às 18:11, George Robinson <george.robinson.br@gmail.com> escreveu:
Prezada lista,

Estou tentando fazer uma leitura em um arquivo .txt e de acordo com o campo que vou ler (identificação da empresa), fazer um cadastro usando cURL via API. Eu tenho a seguinte entrada e a seguinte saída:

cat myCompanyOutput.txt | while IFS=, read hiringDate name last_name cpf cargo departamento telefone email gestorName salary empresa; do if [[$empresa=='myCompany']] ; then curl  -X POST --url "https://public-api.convenia.com.br/api/v3/employees/admission" --header 'Accept: application/json' --header 'token: f5ca4c9f-a530-48e5-ac8c-cf33cf5b74b1' -d "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary"| if [[$empresa=='myCompany02']] ; then curl -X POST --url "https://public-api.convenia.com.br/api/v3/employees/admission" --header 'Accept: application/json' --header 'token: 7b541570-16eb-4468-a222-f7789e1cfff9' -d "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary" | if [[$empresa=='myCompany03']]; then curl  -X POST --url "https://public-api.convenia.com.br/api/v3/employees/admission" --header 'Accept: application/json' --header 'token:  0337304e-1d8f-4252-8676-9eb73c28393e' -d "hiring_date=$hiringDate&name=$name&last_name=$last_name&documents[cpf]=$cpf&job=$cargo&cell=$telefone&email=$email&supervisor[name]=$gestorName&department=$departamento&salary=$salary"; fi;fi;fi; done

SAÍDA:
bash: [[myCompany==myCompany]]: comando não encontrado
bash: [[myCompany02==myCompany]]: comando não encontrado
bash: [[myCompany03==myCompany]]: comando não encontrado

Conteúdo do arquivo myCompanyOutput:
2020-12-01,Guilherme,Rosa,08822812751,Gerente de Remuneração e Benefícios,Tecnologia da Informação,21976748288,guilherme_rosa@me.com,Jonas Fake,16000,myCompany
2020-12-08,George Robinson,da Silva Serejo Santos,10235233706,Analista de Suporte Sênior,Tecnologia da Informação,21974498138,george.robinson.br@gmail.com,Jonas Fake,16000,myCompany02
2020-12-15,Rosilene,Barbosa de Souza,11271238748,Analista de Marketing,Marketing,21966724094,rosilenebs30@gmail.com,Jonas Fake,16000,myCompany03

O caminho seria realmente criar uma confição IF de acordo com o campo que representa a empresa?

Atenciosamente,

--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
(o_  @arkanon  (Twitter)     __o
//\   arkanon@lsd.org.br   _`\<,
V_/_      www.lsd.org.br  (_)/(_)
---------------------------------
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
(o_  @arkanon  (Twitter)     __o
//\   arkanon@lsd.org.br   _`\<,
V_/_      www.lsd.org.br  (_)/(_)
---------------------------------

reply via email to

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