Problema ao usar o if [RESOLVIDO]

13. Re: Problema ao usar o if

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 29/11/2017 - 23:43h

1lucas1 escreveu:

p4ulodi4s escreveu:
Oi.

Poste como ficou usando os operadores que mostrei ...

Uma coisa importante é que existem operadores de comparação diferentes para inteiros e strings. Por exemplo, para comparar se 2 valores são strings iguais, use = . Para comparar se 2 valores são inteiros iguais, use -eq



if [ [$2 = "help" ] -o [ [$# -eq 1] -a [$1 = "help" ] ] ]; then
echo "$0 'Arquivo' 'Tipo'"
echo -e "\nTipos { gcc, latex }"
fi



saida terminal é

lucas@Developer ~/Área de Trabalho $ ./a.sh help help
./a.sh: line 1: [: número excessivo de argumentos



Oi.

Você está tentando ajustar a precedência com os colchetes, certo?

Conforme o @cbgprog adiantou, esses colchetes são apenas um sinônimo para o comando test. De forma mais exata, o sinônimo para o comando test é apenas o primeiro colchete [ , o segundo colchete ] é um parâmetro passado para ter uma sintaxe semelhante a outras linguagens.

Veja:


paulo@notebook:~$ type test
test is a shell builtin
paulo@notebook:~$ type [
[ is a shell builtin
paulo@notebook:~$ type ]
bash: type: ]: not found


No seu código, o primeiro colchete [ é o comando test, os demais são parâmetros e não alteram a precedência dos testes.

Para alterar a precedência, é possível utilizar parenteses () escapados com \ . O código fica assim:


if [ \( $2 = "help" \) -o \( $# -eq 1 -a $1 = "help" \) ]; then
echo "$0 'Arquivo' 'Tipo'"
echo -e "\nTipos { gcc, latex }"
fi


Isso quase funciona, mas ainda pode acontecer um erro dependendo do número de parâmetros que forem passados para o script. Para tornar esse código funcional, proteja as variáveis do tipo string com aspas duplas "" ( inclusive isso é considerado uma boa prática ) , desse jeito:


if [ \( "$2" = "help" \) -o \( $# -eq 1 -a "$1" = "help" \) ]; then
echo "$0 'Arquivo' 'Tipo'"
echo -e "\nTipos { gcc, latex }"
fi


Esse código deve funcionar, faça um teste.

Se quiser, também é possível seguir a sua ideia original e utilizar vários comandos test [ com && e ||, assim:


if [ "$2" = "help" ] || [ $# -eq 1 ] && [ "$1" = "help" ]; then
echo "$0 'Arquivo' 'Tipo'"
echo -e "\nTipos { gcc, latex }"
fi


Porém, assim a precedência definida pelo parenteses foi perdida. Para ter a precedência nesse código, use chaves {} para delimitar um bloco de código que vai ser executado junto. Assim:


if [ "$2" = "help" ] || { [ $# -eq 1 ] && [ "$1" = "help" ] ; } ; then
echo "$0 'Arquivo' 'Tipo'"
echo -e "\nTipos { gcc, latex }"
fi



Linux Professional Institute - LPIC-1
Novell Certified Linux Administrator - CLA
Oracle Certified Associate, Java SE Programmer - OCA

http://twitter.com/p4ulodi4s
http://www.prminformatica.com.br/


  


14. Re: Problema ao usar o if [RESOLVIDO]

lucas
1lucas1

(usa Linux Mint)

Enviado em 30/11/2017 - 07:35h

p4ulodi4s parou de dar erros mas a semantica não está correta pois quando eu passo qualquer comando por linha de comando seguido de um "help" $2 não está entrando no if, e quando eu passo "help" pro $1 não verifica a quantidade de argumentos passado no total "$#" e ja entra no if






15. Re: Problema ao usar o if [RESOLVIDO]

Paulo Dias
di4s

(usa XUbuntu)

Enviado em 30/11/2017 - 10:37h

1lucas1 escreveu:

p4ulodi4s parou de dar erros mas a semantica não está correta pois quando eu passo qualquer comando por linha de comando seguido de um "help" $2 não está entrando no if, e quando eu passo "help" pro $1 não verifica a quantidade de argumentos passado no total "$#" e ja entra no if





Ok, poste como ficou todo o script e algumas das tentativas de execução que você fez com a saída retornada.


Linux Professional Institute - LPIC-1
Novell Certified Linux Administrator - CLA
Oracle Certified Associate, Java SE Programmer - OCA

http://twitter.com/p4ulodi4s
http://www.prminformatica.com.br/


16. Re: Problema ao usar o if [RESOLVIDO]

lucas
1lucas1

(usa Linux Mint)

Enviado em 02/12/2017 - 20:04h

Problema Resolvido estava lendo uma apostila e funcionou para por precedencia é so usar parenteses com caractere de escape

ficou assim




if [ "$2" = "help" -o \( $# -eq 1 -a "$1" = "help" \) ] ; then
echo "$0 'Arquivo' 'Tipo'"
echo -e "\nTipos { gcc, latex }"
fi




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts