No pude encontrar ningún recurso simple y sencillo que explique el significado y la solución para el siguiente error de shell BASH, así que estoy publicando lo que encontré después de investigarlo.
El error:
-bash: [: too many arguments
Versión de los requisitos de Google: bash open square bracket colon too many arguments
.
Contexto: una condición if entre corchetes simples con un operador de comparación simple como igual, mayor que etc., por ejemplo:
VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
# some action
fi
bash
if-statement
arguments
user56reinstatemonica8
fuente
fuente
Respuestas:
Si su
$VARIABLE
es una cadena que contiene espacios u otros caracteres especiales, y se utilizan corchetes individuales (que es un atajo para eltest
comando), entonces la cadena se puede dividir en varias palabras. Cada uno de estos se trata como un argumento separado.Para que una variable se divida en muchos argumentos :
Lo mismo será cierto para cualquier llamada de función que ponga una cadena que contenga espacios u otros caracteres especiales.
Arreglo fácil
Envuelva la salida variable entre comillas dobles, forzándola a permanecer como una cadena (por lo tanto, un argumento). Por ejemplo,
Simple como eso. Pero pase a "También tenga cuidado ..." a continuación si tampoco puede garantizar que su variable no sea una cadena vacía, o una cadena que no contenga más que espacios en blanco.
O, una solución alternativa es usar corchetes dobles (que es un atajo para el
new test
comando).Sin embargo, esto solo existe en bash (y aparentemente korn y zsh), por lo que puede no ser compatible con shells predeterminados llamados por
/bin/sh
etc.Esto significa que en algunos sistemas, podría funcionar desde la consola, pero no cuando se llama a otra parte, como desde
cron
, dependiendo de cómo esté configurado todo.Se vería así:
Si su comando contiene corchetes dobles como este y obtiene errores en los registros pero funciona desde la consola, intente cambiar el
[[
por una alternativa sugerida aquí, o asegúrese de que todo lo que se ejecute en su script use un shell que sea compatible con[[
akanew test
.También ten cuidado con el
[: unary operator expected
errorSi ve el error "demasiados argumentos", es probable que obtenga una cadena de una función con salida impredecible. Si también es posible obtener una cadena vacía (o toda la cadena de espacios en blanco), esto se trataría como cero argumentos incluso con la "solución rápida" anterior, y fallaría con
[: unary operator expected
Es el mismo 'problema' si estás acostumbrado a otros idiomas: no esperas que el contenido de una variable se imprima efectivamente en el código como este antes de que se evalúe.
Aquí hay un ejemplo que evita
[: too many arguments
los[: unary operator expected
errores y los errores: reemplazar la salida con un valor predeterminado si está vacío (en este ejemplo,0
), con comillas dobles alrededor de todo:(aquí, la acción ocurrirá si $ VARIABLE es 0, o está vacío. Naturalmente, debe cambiar el 0 (el valor predeterminado) a un valor predeterminado diferente si se desea un comportamiento diferente)
Nota final: dado que
[
es un atajo paratest
, todo lo anterior también es cierto para el errortest: too many arguments
(y tambiéntest: unary operator expected
)fuente
i=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
Sólo topado con este post, consiguiendo el mismo error, tratando de prueba si dos variables son tanto vacía (o no vacía). Eso resulta ser una comparación compuesta - 7.3. Otros operadores de comparación: Guía avanzada de secuencias de comandos Bash ; y pensé que debería tener en cuenta lo siguiente:
pensar que significa "vacío" al principio; pero eso significa "el archivo existe" - utilícelo-e
-z
para probar la variable vacía (cadena)test
sy&&
ellos:[ ... ] && [ ... ]
-a
operador en un solotest
:[ ... -a ... ]
Aquí hay un comando de trabajo (buscando en todos los archivos txt en un directorio y volcando los que
grep
contienen dos palabras):Edición del 12 de agosto de 2013: nota del problema relacionado:
Tenga en cuenta que al verificar la igualdad de la cadena con el clásico
test
(corchete simple[
), DEBE tener un espacio entre el operador "es igual", que en este caso es un solo=
signo "igual" (aunque dos signos iguales==
parecen ser aceptados como igualdad operador también). Por lo tanto, esto falla (en silencio):... pero agrega el espacio, y todo se ve bien:
fuente
((A || B) && C)
?Otro escenario que puede obtener
[: too many arguments
o[: a: binary operator expected
errores es si intenta probar todos los argumentos"$@"
Funciona correctamente si llamas
foo.sh
ofoo.sh arg1
. Pero si pasa varios argumentos comofoo.sh arg1 arg2
, obtendrá errores. Esto se debe a que se está expandiendo a[ -z arg1 arg2 ]
, que no es una sintaxis válida.La forma correcta de verificar la existencia de argumentos es
[ "$#" -eq 0 ]
. ($#
es el número de argumentos).fuente
Algunas veces si toca el teclado accidentalmente y elimina un espacio.
Activará este mensaje de error. Tenga en cuenta que se requiere el espacio antes de ']'.
fuente
He tenido el mismo problema con mis scripts. Pero cuando hice algunas modificaciones funcionó para mí. Me gustó esto: -
De esa manera resolví mi problema. Espero que eso también te ayude.
fuente