Array em shell [RESOLVIDO]

1. Array em shell [RESOLVIDO]

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 01/05/2017 - 17:21h

Pessoal,

Gostaria de saber como fazer a variável $id_processo ser um array:
Por exemplo: se eu digitar TESTE1FI, TESTE2FI, TESTE3FI

ELE IRÁ repetir o codigo abaixo para cada um dos TESTE1FI, TESTE2FI, TESTE3FI
Deve ser simples, porém sou novata


echo "PROCESSO:"
read id_processo

if [ ${id_processo:11:2}="FI" ]; then
echo "FOLDER_TAM:"
read folder
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $id_processo \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""
echo "INSERT INTO TB_PROCESSO VALUES( '$id_processo', '$id_processo','Carga da tabela $tb1s',NULL,12,${id_processo:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"



  


2. Re: Array em shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/05/2017 - 17:46h

Há algo escrito aqui: https://www.vivaolinux.com.br/artigo/Criando-Arrays-Arrays-Multidimensionais-e-Hashes-em-BASH-Script...

Arrays numéricos começam em 0.
Para a atribuição pode-se usar

meu_array[0]=...
meu_array[1]=...
meu_array[2]=...

igual a variáveis simples, sem espaço no sinal de igual.

Para retornar o valor deve-se usar chaves { e } na variável como em

echo ${meu_array[1]}

Para o tamanho do array usa-se ${#meu_array}
Para exibir todos os valores do array usa-se ${#meu_array[@]} ou ${#meu_array[*]}

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: Array em shell [RESOLVIDO]

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 01/05/2017 - 17:49h

Mas e se eu não sei qual será o tamanho? Ou seja, quantos processos serão colocados?


4. Re: Array em shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/05/2017 - 17:49h

Só uma dúvida: dê um exemplo de como seria esse array.
Você quer "picar" a variável em pedaços e distribuí-los em um array?
O uso do slice com ${var:a:b} pode funcionar até melhor que vetor conforme o caso.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: Array em shell

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 01/05/2017 - 17:53h

Meu array pode ter 10 posições ou 1.

Queria algo dinamico sabe, por exemplo se o usuário entrar com
id_processo = TESTE1FI
ou
id_processo= TESTE2FI

ele ira fazer o "Unix" duas vezes neste exemplo
se entrar com 3 processos separados por "," aparecerá 3 processos Unix e 3 processos de insert

Nao sei se expliquei muito bem

Dessa forma setando array[0], array[1], seu nao tenho controle de quantos serão inseridos e mostrados na tela, entende?

echo "PROCESSO:"
read id_processo[0]
read id_processo[1]


if [ ${id_processo:11:2}="FI" ]; then
echo "FOLDER_TAM:"
read folder
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $id_processo[0] \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $id_processo[1] \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""
echo "INSERT INTO TB_PROCESSO VALUES( '$id_processo[0]', '$id_processo[0]','Carga da tabela $tb1s',NULL,12,${id_processo[0]:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"
echo "INSERT INTO TB_PROCESSO VALUES( '$id_processo[1]', '$id_processo[1]','Carga da tabela $tb1s',NULL,12,${id_processo[1]:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"



6. Re: Array em shell [RESOLVIDO]

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 01/05/2017 - 17:58h

Pensei em algo assim, mas não sei se isso faz repetir as linhas de "Unix" e de "Insert" para cada array

echo "PROCESSO:"
read id_processo

for ((i=0;i<=20;i++))
do
echo 'id_processo['$i']' = ${id_processo[$i]}
done


if [ ${id_processo:11:2}="FI" ]; then
echo "FOLDER_TAM:"
read folder
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $id_processo[i] \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""
echo "INSERT INTO TB_PROCESSO VALUES( '$id_processo[i]', '$id_processo[i]','Carga da tabela $tb1s',NULL,12,${id_processo[i]:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"



7. Re: Array em shell

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 01/05/2017 - 18:10h

Exemplo:
Diga o id do processo: TESTE1S0020FI, TESTE2S00FI, TESTE300FI

Eu quero que crie 3 linhas
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods TESTE1S0020FI \&\n"
echo -e "nohup execods ODS1S000021CE"

echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods TESTE200FI \&\n"
echo -e "nohup execods ODS1S000021CE"

echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods TESTE3S0020FI \&\n"
echo -e "nohup execods ODS1S000021CE"

E 3 LINHAS para cada id_processo inserido :
INSERT INTO TB_PROCESSO VALUES( 'TESTE1S0020FI ', 'TESTE1S0020FI','Carga da tabela $tb1s',NULL,12,${id_processo:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"
INSERT INTO TB_PROCESSO VALUES( 'TESTE2S0020FI ', 'TESTE1S0020FI','Carga da tabela $tb1s',NULL,12,${id_processo:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"
INSERT INTO TB_PROCESSO VALUES( 'TESTE3S0020FI ', 'TESTE1S0020FI','Carga da tabela $tb1s',NULL,12,${id_processo:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"

Porém esse numero de processos pode variar de 1 a .....nao sei quantos

echo "PROCESSO:"
read id_processo
if [ ${id_processo:11:2}="FI" ]; then
echo "FOLDER_TAM:"
read folder
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $id_processo \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $id_processo \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""
echo "INSERT INTO TB_PROCESSO VALUES( '$id_processo', '$id_processo','Carga da tabela $tb1s',NULL,12,${id_processo:7:4}, NULL,'$folder','1S', SYSDATE, 'S');"



8. Re: Array em shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/05/2017 - 18:35h

No caso de algo como

LISTAPROCS="PROC1, PROC2, PROC3"

pode ser que tenha espaços em branco dentro, então elimina-se eles com sed ou com truques do BASH.

LISTAPROCS=${LISTAPROCS// /}

isto remove espaços em branco.

Agora para transformar em array some-se com as vírgulas e troca-se por espaços

LISTAPROCS=${LISTAPROCS//,/ }

isto fica sendo uma string onde elementos são separados por um único espaço em branco. Para fazer array há uma sintaxe própria

ARRAY=($LISTAPROCS)

Há ainda um erro lá em cima no caso do

if [ ${var:11:2}="X" ]

a sintaxe pede espaçamento e duplo sinal de igual ==

if [ ${var:11:2} == "X" ]

e é bom colocar aspas duplas para o caso de alguma variável retornar vazio ou inexistente porque isto dá erro

if [ "${var:11:2}" == "X" ]

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



9. Re: Array em shell

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 01/05/2017 - 18:41h

Beleza,

e isso fará repetir o que eu quero em caso de mais de um processo?

a chamada seria:

echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods ${LISTAPROCS//,/ }&\n"
echo -e "nohup execods ODS1S000021CE"


echo "PROCESSO:"
read id_processo
LISTAPROCS=${id_processo// /}
LISTAPROCS=${id_processo//,/ }
ARRAY=($LISTAPROCS)

if [ "${id_processo:11:2}" == "FI" ]; then
echo "FOLDER_TAM:"
read folder
echo ""
echo "Unix: FI"
echo ""
echo -e "nohup execods ODS1S000020CE \&\n"
echo -e "nohup execods $ARRAY \&\n"
echo -e "nohup execods ODS1S000021CE"
echo "TABELA 1S:"
read tb1s
echo ""

?

desculpa a ignorancia, estou vendo videos pra tentar aprender


10. AWK

yasmine malafaia de miranda
yasminemm

(usa Ubuntu)

Enviado em 02/05/2017 - 01:11h

Será que com awk nao ficaria mais simples?



11. Re: Array em shell

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/05/2017 - 21:05h

Você quer o efeito de “read -a”, e depois uma iteração com for?

#!/bin/bash
read -a procs
for (( i=0; i<${#procs[@]}; i++ )); do
echo "Processo $i: ${procs[i]}."
done



12. Re: Array em shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/05/2017 - 21:12h

Até agora não entendi essa coisa de processo.
Parece até ter alguma coisa de BD misturada.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts