Estou executando algum script que passa o argumento string e quero fazer a declaração if else mostrada abaixo:
if [ $1 != '' ] && [ $2 != '' ]
then
do something.....
mas mostrou Error too many argument
. Por quê?
command-line
bash
scripts
taymindis Woon
fonte
fonte
[[ ]]
. Caso contrário, você deve citar suas variáveis.$1
pode estar desconfigurado ou configurado como string nula pelo usuário do script. Considere esta seqüência de comandos:$ set '' bar
depoisecho "x${1}x";
Ambas as variáveis são definidas, mas um deles é nulo.Respostas:
Tente usar o teste -z:
Do homem
bash
:fonte
Como isso está marcado
bash
, eu recomendo que você use a construção de teste estendida ([[...]]
) e esqueça as aspas:A menos que você esteja
sh
buscando compatibilidade com / POSIX, não há motivo para não usá-lo[[ ]]
.fonte
O seguinte também funciona,
fonte
&&
e outros separadores de comandos lógicos não são permitidos no clássicotest
. Você tem que usar outras construções de teste em vez (como-a
, eu acho)Para a versão antiga da resposta, consulte a segunda parte desta resposta. Se você quiser saber detalhes, continue lendo
A causa do problema
Na própria pergunta, é relatado que o OP vê
too many arguments error
, o que, quando testadobash
, não parece ser o caso:Com o
/bin/sh
qual está realmente vinculado ao/bin/dash
Ubuntu, o erro relatado da seguinte maneira:E o autônomo
/bin/test
também:Sidenote: Se você está se perguntando o que é
/usr/bin/test
e porque eu estou usandobash
esh
, em seguida, você deve saber que[
é alias paratest
o comando, que também existe como executável autônomo ou mais comumente - como shell built-in que é o que cada shell usará primeiro . Quanto àsif
instruções, elas operam nas estátuas de saída dos comandos, daí o motivo[
etest
são comandos, com tudo o mais sendo argumentos para esses comandos - a ordem incorreta desses argumentos da linha de comando leva a erros.Voltar ao tópico: não está claro como o OP recebeu o erro não relacionado. No entanto, nos três casos, o problema é o mesmo - a variável não definida será tratada como vazia, portanto, o que o shell vê com essas variáveis não citadas é
que quebra a sintaxe que
test
entende. Lembra do que eu disse sobre a ordem imprópria dos argumentos da linha de comando? Por isso, é importante citar. Vamos ativar a saída de diagnóstico e ver o que o shell executa:Melhor maneira de testar variáveis não definidas
Uma abordagem muito frequente que você vê ao redor é a seguinte:
Para citar Gilles :
Presumivelmente, isso deve ser bastante portátil, já que eu os vi em
/bin/sh
scripts. Também pode ser combinado como emÉ claro que poderíamos usar a
-z
bandeira, no entanto, de acordo com pesquisas em algumas conchas, particularmente o ksh88 (de acordo com Stephane Chazelas ), essa bandeira está com defeito.Veja também
\[
vs\[\[
vs((
fonte
Acho que o título da postagem não é exato, pois a intenção da mensagem era verificar se $ 1 e $ 2 não são nulos. O exemplo dado estava faltando aspas duplas em $ 1 e $ 2 para funcionar. As variáveis devem ser aspas duplas para serem expandidas ao comparar cadeias. Mas, verificar se $ 1 e $ 2 existem é o mesmo que verificar se $ 2 existem, pois não pode existir se $ 1 não existir. O comando 'if' também não é necessário neste caso, pois 'test' retorna true / false e usa '&&' como 'then' se return for 0 / true:
Mais simples, com -n (diferente de zero):
Para "verificar se $ 1 e $ 2 são nulos" seria o mesmo que verificar se não há parâmetro:
fonte