Enviado em 29/11/2017 - 23:43h
1lucas1 escreveu:
saida terminal é
lucas@Developer ~/Área de Trabalho $ ./a.sh help help
./a.sh: line 1: [: número excessivo de argumentos
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
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/