Não consegui encontrar nenhum recurso simples e simples explicitando o significado e a correção do seguinte erro de shell BASH, por isso estou postando o que encontrei depois de pesquisá-lo.
O erro:
-bash: [: too many arguments
Versão Google-friendly: bash open square bracket colon too many arguments
.
Contexto: uma condição if entre colchetes simples com um operador de comparação simples como igual a, maior que etc, por exemplo:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
bash
if-statement
arguments
user56reinstatemonica8
fonte
fonte
Respostas:
Se
$VARIABLE
for uma sequência contendo espaços ou outros caracteres especiais, e colchetes simples forem usados (que é um atalho para otest
comando), a sequência poderá ser dividida em várias palavras. Cada um deles é tratado como um argumento separado.Para que uma variável seja dividida em vários argumentos :
O mesmo vale para qualquer chamada de função que coloque uma string contendo espaços ou outros caracteres especiais.
Correção fácil
Coloque a saída variável entre aspas duplas, forçando-a a permanecer como uma sequência (portanto, um argumento). Por exemplo,
Simples assim. Mas pule para "Também tome cuidado ..." abaixo se você também não puder garantir que sua variável não será uma sequência vazia ou uma sequência que não contenha nada além de espaço em branco.
Ou, uma correção alternativa é usar colchetes duplos (que é um atalho para o
new test
comando).Porém, isso existe apenas no bash (e aparentemente korn e zsh) e, portanto, pode não ser compatível com os shells padrão chamados por
/bin/sh
etc.Isso significa que em alguns sistemas, ele pode funcionar no console, mas não quando chamado em outro lugar, como em
cron
, dependendo de como tudo está configurado.Seria assim:
Se o seu comando contiver colchetes duplos como esse e você receber erros nos logs, mas funcionar no console, tente trocar a
[[
alternativa sugerida aqui ou verifique se o que executa o script usa um shell que suporte[[
akanew test
.Também tenha cuidado com o
[: unary operator expected
erroSe você estiver vendo o erro "muitos argumentos", é provável que esteja obtendo uma string de uma função com saída imprevisível. Se também for possível obter uma string vazia (ou toda a string de espaço em branco), isso seria tratado como zero argumento, mesmo com a "correção rápida" acima, e falharia com
[: unary operator expected
É a mesma 'pegadinha' se você estiver acostumado a outros idiomas - não espera que o conteúdo de uma variável seja efetivamente impresso no código como este antes de ser avaliado.
Aqui está um exemplo que impede
[: too many arguments
os[: unary operator expected
erros e: substituir a saída por um valor padrão se estiver vazio (neste exemplo0
), com aspas duplas em volta da coisa toda:(aqui, a ação ocorrerá se $ VARIABLE for 0 ou vazio. Naturalmente, você deve alterar 0 (o valor padrão) para um valor padrão diferente se um comportamento diferente for desejado)
Nota final: como
[
é um atalho paratest
, tudo acima também é verdadeiro para o errotest: too many arguments
(e tambémtest: unary operator expected
)fonte
i=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
Apenas batido para este post, por recebendo o mesmo erro, tentando testar se duas variáveis são tanto vazio (ou não-vazia). Isso acaba sendo um comparação composta - 7.3. Outros operadores de comparação - Advanced Bash-Scripting Guide ; e pensei em observar o seguinte:
pensar que significa "vazio" a princípio; mas isso significa "arquivo existe" - use-e
-z
para testar a variável vazia (string)test
s e&&
eles:[ ... ] && [ ... ]
-a
operador em um únicotest
:[ ... -a ... ]
Aqui está um comando funcional (pesquisando todos os arquivos txt em um diretório e despejando os que
grep
encontrarem contêm duas palavras):Editar 12 de agosto de 2013: nota de problema relacionada:
Observe que, ao verificar a igualdade das cordas com o clássico
test
(colchete simples[
), você DEVE ter um espaço entre o operador "é igual", que neste caso é um único=
sinal de "iguais" (embora dois sinais de iguais==
pareçam ser aceitos como igualdade) operador também). Assim, isso falha (silenciosamente):... mas adicione o espaço - e tudo ficará bem:
fonte
((A || B) && C)
?Outro cenário que você pode obter o
[: too many arguments
ou[: a: binary operator expected
erros é se você tentar teste para todos os argumentos"$@"
Funciona corretamente se você ligar
foo.sh
oufoo.sh arg1
. Mas se você passar vários argumentosfoo.sh arg1 arg2
, receberá erros. Isso ocorre porque está sendo expandido para[ -z arg1 arg2 ]
, o que não é uma sintaxe válida.A maneira correta de verificar a existência de argumentos é
[ "$#" -eq 0 ]
. ($#
é o número de argumentos).fonte
Algumas vezes Se você tocar no teclado acidentalmente e remover um espaço.
Irá disparar essa mensagem de erro. Observe o espaço antes de ']' ser necessário.
fonte
Eu tive o mesmo problema com meus scripts. Mas quando eu fiz algumas modificações, funcionou para mim. Eu fiz assim: -
Dessa forma, resolvi meu problema. Espero que ajude você também.
fonte