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:
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: