./teste.sh: line 9: [: -eq: unary operator expected
ERRO
Esse erro é um erro de construção no shell. Minha dica é que você SEMPRE coloque a avaliação de variáveis entre aspas, porque se a variável não estiver definida ou tiver um valor nulo, a presença das aspas faz toda a diferença.
for var in exemplo teste ""; do
# Uso adequado, mesmo que “var” seja vazio ou indefinido: com aspas
[ "$var" = exemplo ] && echo "É 'exemplo'." || echo "Não é 'exemplo', é '$var'."
# Uso perigoso quando “var” for vazio ou indefinido: sem aspas
[ $var = exemplo ] && echo "É 'exemplo'." || echo "Não é 'exemplo', é '$var'."
done
O resultado da execução é o seguinte:
É 'exemplo'.
É 'exemplo'.
Não é 'exemplo', é 'teste'.
Não é 'exemplo', é 'teste'.
Não é 'exemplo', é ''.
bash: [: =: unary operator expected
Para esclarecer: quando você substitui um valor vazio ou indefinido entre aspas, o shell entende como um argumento existente, mas com tamanho zero. Sem aspas, ele simplesmente não coloca nada naquele lugar. No caso acima, o segundo comando [ é chamado como e fosse simplesmente “[ = exemplo ]”, sem argumento no lado esquerdo da comparação, o que é um erro.
Que tipo de comando eu posso usar para me trazer somente o resultado que a pagina funcionou ou não funcinou?
Eu mostrei o comando numa postagem anterior. Só não usei o wget, mas sim o curl, que é melhor para esse tipo de coisa.
só preciso criar um script dando um wget dizendo que a pagina funcionou ( no caso a pagina estar no ar) e não funcionou ( pagina fora do ar)
Como eu disse na outra postagem, o curl é mais amigável para uso em scripts do que o wget. Você tem mesmo de usar wget? Se tem, procure fazer algo semelhante ao que eu mostrei usando o curl.
Galera Bom dia!
Meus conhecimentos em shell não é nada avançado, meu conhecimento é básico e gostaria muito de uma ajuda de vocês. È o seguinte:
Tenho a URL: wget http://www.atp.com.br/extranet/servicoBanco/service.asmx
O resultado tem que ser = 200, caso o resultado for diferente de 200 tem que dá erro.
EU tentei:
#!/bin/bash
$resultado = wget http://www.atp.com.br/extranet/servicoBanco/service.asmx
if [ $resultado = 200 ]; then
echo OK
else
echo ERRO
fi
Eu sei que falta bastante coisa, porém nao consigo avançar. poderiam me ajudar?
Obrigado galera pela ajuda!
-------------------------------------
Boa tarde.
Para definir a VARIÁVEL "resultado", faça:
----------------------------------------------------------------------------------------
Se resolver, marque como resolvido, por favor.
Gostando da resposta, marque-a como a MELHOR, dessa forma, ganho uns pontinhos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :) ----------------------------------------------------------------------------------------
Att.:
Marcelo
Marcelo não funcionou...
----------------------------------------------------
Boa tarde!
Não testei a URL, nem tampouco o comando wget utilizado.
Somente coloquei a sintaxe correta na definição da VAR
e alterei o "TEST", trocando = por -eq
att.:
marcelo
15. Re: Shell script usando o wget
removidousa Nenhuma
Post recolhido
Enviado em 31/03/2016 - 20:52h
paulo1205 escreveu:
listeiro_037 escreveu:
Não estou acostumado com o curl.
Fui testar ele jogando a saída prá variável e ... ele jogou o stream HTML todo para $resultado.
Com uma linha de comando diferente da que eu sugeri, certo? Porque na que eu sugeri, eu joguei a resposta para /dev/null com a opção -o, e mandei imprimir apenas o código de resposta HTTP com a opção -w. E funciona!
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
16. Re: Shell script usando o wget
andrecosta62usa Outra
Post recolhido
Enviado em 01/04/2016 - 10:35h
patrickpcs escreveu:
Cara, deixa ver se eu entendi o que você está desejando.
Você quer fazer o download desse arquivo que está nessa url e verificar se o download foi bem sucedido? Se for isso, eis as minhas dicas.....
Todo comando quando executado, emite uma saída de status. Se for bem executado independentemente de qual comando for, a saída é sempre = 0. Qualquer outro valor informado no status de saída do comando significa algum erro, ai já varia de programa para programa, comando para comando.
Como saber o status de saída de um comando? Simples, pelo próprio terminal você pode ter uma ideia do funcionamento. Digite o comando ping localhost, e deverá ser bem sucedido, logo em seguida você executa um echo $?. O valor dessa "variável" é o status de saída do último comando executado e como eu tenho fé que o comando ping localhost deverá ser bem sucedido você ira ver o valor 0. Caso você dê um ping em um endereço inválido, o status de saída será diferente. Veja esse exemplo aqui....
patrick@X550LN:~$ ping -c 2 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.027 ms
Pegou a ideia? Certo...e o que isso tem a ver com o seu problema? Bem, veja só.
Como o "if" funciona na verdade em shell script?
O "if" analisa o status de saída do comando posterior ao "if", o que algumas pessoas não atentam ou professores não explicam é que a sintaxe if [condição]; then na verdade é um facilitador digamos assim para o comando test. Ou seja....
isso
if [ $resultado -eq 200 ]; then
é igual a isso
if test $resultado -eq 200 ; then
O comando test que tem as funcionalidades de comparação entre outras coisas e o IF apenas faz uma análise do status de saída do comando test.
Se o status de saída for 0, quer dizer que é verdade, se for diferente de 0, quer dizer que não é verdade.
Então se você quer saber se o comando wget foi executado com sucesso, você tem que pegar o valor do status de saída do comando wget e jogar isso para a condicional IF.
Existem duas formas de fazer isso. Você pode fazer parecido do seu jeito, jogando o status de saída para dentro de uma outra variável (aquela $resultado) e depois fazer a comparação...
Ou de uma forma que eu particularmente acho mais elegante.
Esqueça o comando test e suas comparações, faça o if analisar diretamente o comando que você está executando.....por exemplo com o comando ping...
No caso abaixo eu joguei a saída de tela para o /dev/null para não ficar aparecendo um monte de informações na tela.
if ping -c 2 localhost > /dev/null; then
echo "ping bem sucedido"
else
echo "falha no ping"
fi
Então se a minha interpretação do seu post estiver correta, essa é a solução...
-----------------------------------------------------------------------------------------------------------------------------------
Bom dia patrick, tudo bem? cara obrigado pela ajuda! o código funciona, mais o que eu preciso é que quando eu execute o script me traz somente o resultado do ECHO, conforme exemplo acima.
Quando eu executar o script dando um ./teste.sh eu preciso que ele me traga o resultado somente do echo.
por exemplo: quando eu executar ./teste.sh e conseguir fazer o download me retornar somente o resultado: "download efetuado com sucesso."
e se por acaso der erro me retorna somente a mensagem: "falha no download!!!"
Pois quando eu executo aqui ele me retorna todo o conteudo da pagina + o download e embaixo e mostra que o "download efetuado com sucesso" ou seja ele nao retorna somente o echo entendeu?? espero que sim rsrs..
17. Re: Shell script usando o wget
msoliverusa Debian
Post recolhido
Enviado em 01/04/2016 - 13:34h
andrecosta62 escreveu:
patrickpcs escreveu:
Cara, deixa ver se eu entendi o que você está desejando.
Você quer fazer o download desse arquivo que está nessa url e verificar se o download foi bem sucedido? Se for isso, eis as minhas dicas.....
Todo comando quando executado, emite uma saída de status. Se for bem executado independentemente de qual comando for, a saída é sempre = 0. Qualquer outro valor informado no status de saída do comando significa algum erro, ai já varia de programa para programa, comando para comando.
Como saber o status de saída de um comando? Simples, pelo próprio terminal você pode ter uma ideia do funcionamento. Digite o comando ping localhost, e deverá ser bem sucedido, logo em seguida você executa um echo $?. O valor dessa "variável" é o status de saída do último comando executado e como eu tenho fé que o comando ping localhost deverá ser bem sucedido você ira ver o valor 0. Caso você dê um ping em um endereço inválido, o status de saída será diferente. Veja esse exemplo aqui....
patrick@X550LN:~$ ping -c 2 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.027 ms
Pegou a ideia? Certo...e o que isso tem a ver com o seu problema? Bem, veja só.
Como o "if" funciona na verdade em shell script?
O "if" analisa o status de saída do comando posterior ao "if", o que algumas pessoas não atentam ou professores não explicam é que a sintaxe if [condição]; then na verdade é um facilitador digamos assim para o comando test. Ou seja....
isso
if [ $resultado -eq 200 ]; then
é igual a isso
if test $resultado -eq 200 ; then
O comando test que tem as funcionalidades de comparação entre outras coisas e o IF apenas faz uma análise do status de saída do comando test.
Se o status de saída for 0, quer dizer que é verdade, se for diferente de 0, quer dizer que não é verdade.
Então se você quer saber se o comando wget foi executado com sucesso, você tem que pegar o valor do status de saída do comando wget e jogar isso para a condicional IF.
Existem duas formas de fazer isso. Você pode fazer parecido do seu jeito, jogando o status de saída para dentro de uma outra variável (aquela $resultado) e depois fazer a comparação...
Ou de uma forma que eu particularmente acho mais elegante.
Esqueça o comando test e suas comparações, faça o if analisar diretamente o comando que você está executando.....por exemplo com o comando ping...
No caso abaixo eu joguei a saída de tela para o /dev/null para não ficar aparecendo um monte de informações na tela.
if ping -c 2 localhost > /dev/null; then
echo "ping bem sucedido"
else
echo "falha no ping"
fi
Então se a minha interpretação do seu post estiver correta, essa é a solução...
-----------------------------------------------------------------------------------------------------------------------------------
Bom dia patrick, tudo bem? cara obrigado pela ajuda! o código funciona, mais o que eu preciso é que quando eu execute o script me traz somente o resultado do ECHO, conforme exemplo acima.
Quando eu executar o script dando um ./teste.sh eu preciso que ele me traga o resultado somente do echo.
por exemplo: quando eu executar ./teste.sh e conseguir fazer o download me retornar somente o resultado: "download efetuado com sucesso."
e se por acaso der erro me retorna somente a mensagem: "falha no download!!!"
Pois quando eu executo aqui ele me retorna todo o conteudo da pagina + o download e embaixo e mostra que o "download efetuado com sucesso" ou seja ele nao retorna somente o echo entendeu?? espero que sim rsrs..
Boa tarde andrecosta62.
Com uma pequena alteração no comando sugerido pelo Patrick, chega-se ao resultado desejado:
andrecosta62 escreveu:
Galera Bom dia!
Meus conhecimentos em shell não é nada avançado, meu conhecimento é básico e gostaria muito de uma ajuda de vocês. È o seguinte:
Tenho a URL: wget http://www.atp.com.br/extranet/servicoBanco/service.asmx
O resultado tem que ser = 200, caso o resultado for diferente de 200 tem que dá erro. EU tentei:
#!/bin/bash
$resultado = wget http://www.atp.com.br/extranet/servicoBanco/service.asmx
if [ $resultado = 200 ]; then
echo OK
else
echo ERRO
fi
Eu sei que falta bastante coisa, porém nao consigo avançar. poderiam me ajudar?
Obrigado galera pela ajuda!
---------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------
Boa tarde, andrecosta62.
Com o comando abaixo, vc obtém o "200 OK", caso o acesso seja concluído . . .
wget --spider -nv -o messages.txt 'http://www.terra.com.br';if egrep -o '200 OK$' messages.txt;then echo -e "ACESSO CONCLUÍDO COM SUCESSO";else echo "PROBLEMAS NO ACESSO:\n$(cat messages.txt)";fi
200 OK
ACESSO CONCLUÍDO COM SUCESSO
wget --spider -nv -o messages.txt 'http://www.momomo.com.br';if egrep -o '200 OK$' messages.txt;then echo -e "ACESSO CONCLUÍDO COM SUCESSO";else echo -e "PROBLEMAS NO ACESSO:\n$(cat messages.txt)";fi
PROBLEMAS NO ACESSO:
wget: não foi possível resolver endereço de máquina “www.momomo.com.br”
Agora eu testei, senão "tomo" bronca e fico de castigo. Rsrsrs.
----------------------------------------------------------------------------------------
Se resolver, marque como resolvido, por favor.
Gostando da resposta, marque-a como a MELHOR, dessa forma, ganho uns pontinhos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :) ----------------------------------------------------------------------------------------