Shell script | Erro de validacao

1. Shell script | Erro de validacao

RODOLFO JOSE MARQUES GUEIROS
Rodollfo

(usa Ubuntu)

Enviado em 29/01/2020 - 16:25h

Pessoal, sou um pequeno gafanhoto e busco aprender sempre. Durante minha tentativa frustrada tentei criar um script que pode fazer 3 tipos de verificações, são elas:

1* Caso exista diretório e arquivo, faça:
echo "Diretorio ja existe, abaixo o(s) pacote(s) encontrado(s)"

2* Se não existe dirétorio, faça:
echo "Diretorio nao existe, vamos cria-lo!........."
mkdir $dLocal
echo "$dLocal"

3* Senão:
echo " Nao existe pacote neste diretório, "
echo " Favor copia-lo e prossiga com a subida "

Problema
Quando existe apenas um arquivo(txt) no diretório dLocal a condição 1 é lida. Porém ao existir mais de um a condição 1 é ignorada e ele só identifica o else.

Segue Script que montei:


#!/bin/sh

vLine="----------------------------------------------------------------------------"
vSysdt=$(date +%d%m%Y)

dLocal="/home/rodolfo.gueiros/teste/$vSysdt"
vPct=$(ls ${dLocal}/*.tar.gz)
dCopia="/home/rodolfo.gueiros/teste/copia"

clear
echo $vLine
echo "EXECUTANDO SCRIPT..."
echo $vLine
echo " "
if [[ -d "$dLocal" ]] && [[ -e "$vPct" ]]; then
echo "Diretorio ja existe, abaixo o(s) pacote(s) encontrado(s)"
echo $vLine
echo " "
echo "$vPct "
echo " "
cp -f -p -R $dLocal/*.txt $dCopia
chmod -R 777 $dCopia
echo " "
echo "Pacote(s) copiado(s) com sucesso!! "
echo $vLine
ls -1 $dCopia
echo " "

elif [ ! -e "$dLocal" ]; then
echo "Diretorio nao existe, vamos cria-lo!........."
echo " "
echo " "
mkdir $dLocal
chmod -R 777 $dLocal
echo "Diretorio criado com sucesso!"
echo $vLine
echo "$dLocal "
echo $vLine
echo " "

else
echo " "
echo $vLine
echo " Nao existe pacote neste diretorio, "
echo "Favor copia-lo e prossiga com a subida "
echo $vLine
echo " "

fi



  


2. Re: Shell script | Erro de validacao

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/01/2020 - 17:57h

A opção -e do [[ é para qualquer arquivo, inclusive pastas (a pasta é um arquivo especial). Para ser qq arquivo regular, use -f.

O test [[ to bash só verifica um arquivo por vez. Você deve trabalhar com arrays para pegar todos os nomes dos arquivos com o ls, e depois fazer um loop que test, por exemplo

LISTA=("$(ls  /dir/*.tar.gz)")

for ARQ in "${LISTA[@]}"; do
if [[ -f "${ARQ}" ]]; then
echo "Pacote encontrado: ${ARQ}"
fi
done



3. Re: Shell script | Erro de validacao

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/01/2020 - 18:24h


Rodollfo escreveu:

Pessoal, sou um pequeno gafanhoto e busco aprender sempre. Durante minha tentativa frustrada tentei criar um script que pode fazer 3 tipos de verificações, são elas:

1* Caso exista diretório e arquivo, faça:
echo "Diretorio ja existe, abaixo o(s) pacote(s) encontrado(s)"

2* Se não existe dirétorio, faça:
echo "Diretorio nao existe, vamos cria-lo!........."
mkdir $dLocal
echo "$dLocal"

3* Senão:
echo " Nao existe pacote neste diretório, "
echo " Favor copia-lo e prossiga com a subida "

Problema
Quando existe apenas um arquivo(txt) no diretório dLocal a condição 1 é lida. Porém ao existir mais de um a condição 1 é ignorada e ele só identifica o else.

Segue Script que montei:


#!/bin/sh

vLine="----------------------------------------------------------------------------"
vSysdt=$(date +%d%m%Y)

dLocal="/home/rodolfo.gueiros/teste/$vSysdt"
vPct=$(ls ${dLocal}/*.tar.gz)
dCopia="/home/rodolfo.gueiros/teste/copia"

clear
echo $vLine
echo "EXECUTANDO SCRIPT..."
echo $vLine
echo " "
if [[ -d "$dLocal" ]] && [[ -e "$vPct" ]]; then
echo "Diretorio ja existe, abaixo o(s) pacote(s) encontrado(s)"
echo $vLine
echo " "
echo "$vPct "
echo " "
cp -f -p -R $dLocal/*.txt $dCopia
chmod -R 777 $dCopia
echo " "
echo "Pacote(s) copiado(s) com sucesso!! "
echo $vLine
ls -1 $dCopia
echo " "

elif [ ! -e "$dLocal" ]; then
echo "Diretorio nao existe, vamos cria-lo!........."
echo " "
echo " "
mkdir $dLocal
chmod -R 777 $dLocal
echo "Diretorio criado com sucesso!"
echo $vLine
echo "$dLocal "
echo $vLine
echo " "

else
echo " "
echo $vLine
echo " Nao existe pacote neste diretorio, "
echo "Favor copia-lo e prossiga com a subida "
echo $vLine
echo " "

fi

Boa tarde Rodolfo.
O Erro está em:
if [[ -d "$dLocal" ]] && [[ -e "$vPct" ]]; then
Para testar a variável "$vPct",
Use: 
-n É não nula
-z É nula


if [[ -d "$dLocal" ]] && [[ -n "$vPct" ]]; then
Dica: O "echo -e" é o \n são amigos, use-os:
echo -e "\nDiretório criado com sucesso!\n$vLine\n$dLocal\n$vLine\n"
Leitura recomendada:
https://aurelio.net/shell/canivete/

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


4. Re: Shell script | Erro de validacao

RODOLFO JOSE MARQUES GUEIROS
Rodollfo

(usa Ubuntu)

Enviado em 30/01/2020 - 15:34h

marimbondo2 escreveu:

A opção -e do [[ é para qualquer arquivo, inclusive pastas (a pasta é um arquivo especial). Para ser qq arquivo regular, use -f.

O test [[ to bash só verifica um arquivo por vez. Você deve trabalhar com arrays para pegar todos os nomes dos arquivos com o ls, e depois fazer um loop que test, por exemplo

LISTA=("$(ls  /dir/*.tar.gz)")

for ARQ in "${LISTA[@]}"; do
if [[ -f "${ARQ}" ]]; then
echo "Pacote encontrado: ${ARQ}"
fi
done


Maribondo

Muito obrigado, aprendi mais uma forma de ser feito confesso que preciso estudar mais arrays, mas testei e funcionou. A única modificação que realizei foi no parâmetro do if substitui o "-f" por "-n" e funcionou, pois a forma com o -f apresentou o erro abaixo e não listou:

tar: option requires an argument -- 'f'
Try `tar --help' or `tar --usage' for more information.



5. Re: Shell script | Erro de validacao

RODOLFO JOSE MARQUES GUEIROS
Rodollfo

(usa Ubuntu)

Enviado em 30/01/2020 - 15:45h

msoliver escreveu:


Rodollfo escreveu:

Pessoal, sou um pequeno gafanhoto e busco aprender sempre. Durante minha tentativa frustrada tentei criar um script que pode fazer 3 tipos de verificações, são elas:

1* Caso exista diretório e arquivo, faça:
echo "Diretorio ja existe, abaixo o(s) pacote(s) encontrado(s)"

2* Se não existe dirétorio, faça:
echo "Diretorio nao existe, vamos cria-lo!........."
mkdir $dLocal
echo "$dLocal"

3* Senão:
echo " Nao existe pacote neste diretório, "
echo " Favor copia-lo e prossiga com a subida "

Problema
Quando existe apenas um arquivo(txt) no diretório dLocal a condição 1 é lida. Porém ao existir mais de um a condição 1 é ignorada e ele só identifica o else.

Segue Script que montei:


#!/bin/sh

vLine="----------------------------------------------------------------------------"
vSysdt=$(date +%d%m%Y)

dLocal="/home/rodolfo.gueiros/teste/$vSysdt"
vPct=$(ls ${dLocal}/*.tar.gz)
dCopia="/home/rodolfo.gueiros/teste/copia"

clear
echo $vLine
echo "EXECUTANDO SCRIPT..."
echo $vLine
echo " "
if [[ -d "$dLocal" ]] && [[ -e "$vPct" ]]; then
echo "Diretorio ja existe, abaixo o(s) pacote(s) encontrado(s)"
echo $vLine
echo " "
echo "$vPct "
echo " "
cp -f -p -R $dLocal/*.txt $dCopia
chmod -R 777 $dCopia
echo " "
echo "Pacote(s) copiado(s) com sucesso!! "
echo $vLine
ls -1 $dCopia
echo " "

elif [ ! -e "$dLocal" ]; then
echo "Diretorio nao existe, vamos cria-lo!........."
echo " "
echo " "
mkdir $dLocal
chmod -R 777 $dLocal
echo "Diretorio criado com sucesso!"
echo $vLine
echo "$dLocal "
echo $vLine
echo " "

else
echo " "
echo $vLine
echo " Nao existe pacote neste diretorio, "
echo "Favor copia-lo e prossiga com a subida "
echo $vLine
echo " "

fi

Boa tarde Rodolfo.
O Erro está em:
if [[ -d "$dLocal" ]] && [[ -e "$vPct" ]]; then
Para testar a variável "$vPct",
Use: 
-n É não nula
-z É nula


if [[ -d "$dLocal" ]] && [[ -n "$vPct" ]]; then
Dica: O "echo -e" é o \n são amigos, use-os:
echo -e "\nDiretório criado com sucesso!\n$vLine\n$dLocal\n$vLine\n"
Leitura recomendada:
https://aurelio.net/shell/canivete/

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


msoliver

Mano, SHOW de bola!
Eu criei mais um shell adicionando a sua sugestão e testando a sugestão do maribondo, ambas funcionaram. A sua em específico fiquei muito p. da vida porque enquanto estava pesquisando vi essa opção e não testei porque pensava que não se encaixava já que existia o -f ou -s, mas muito obrigado aprendi mais uma!!

Segue algumas fontes que pesquisei se alguém que ver esse tópico quiser verificar:

http://blog.evaldojunior.com.br/aulas/blog/shell%20script/2011/05/08/shell-script-parte-2-controle-d...

https://www.livrosdelinux.com.br/if-then-else/

http://shellscriptx.blogspot.com/2016/12/estrutura-condicional-if-then-elif-else-fi.html

https://cleitonbueno.com/shell-script-estrutura-condicional/






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts