Estoy ejecutando un script que pasa el argumento de cadena y quiero hacer si la instrucción else se muestra a continuación:
if [ $1 != '' ] && [ $2 != '' ]
then
do something.....
Pero se muestra Error too many argument
. ¿Por qué?
command-line
bash
scripts
taymindis Woon
fuente
fuente
[[ ]]
. De lo contrario, debe citar sus variables.$1
podría ser desarmado o establecido en una cadena nula por el usuario del script. Considere esta secuencia de comando:$ set '' bar
entoncesecho "x${1}x";
Ambas variables están establecidas, pero una de ellas es nula.Respuestas:
Intente usar la prueba -z:
Del hombre
bash
:fuente
Como esto está etiquetado
bash
, recomiendo que uno use la construcción de prueba extendida ([[...]]
) y olvide las comillas:A menos que vaya por
sh
compatibilidad / POSIX, no hay razón para no usar[[ ]]
.fuente
Lo siguiente también funciona,
fuente
&&
y otros separadores de comandos lógicos no están permitidos en el clásicotest
. Tienes que usar otras construcciones de prueba en su lugar (como-a
, creo)Para la versión anterior de la respuesta, vea la segunda parte de esta respuesta. Si desea conocer los detalles, siga leyendo
La causa del problema
En la pregunta en sí, se informa que OP ve
too many arguments error
, que cuando se pruebabash
no parece ser el caso:Con lo
/bin/sh
que en realidad está vinculado a/bin/dash
Ubuntu, el error se informa de la siguiente manera:Y el independiente
/bin/test
también:Nota al margen: si se pregunta qué es
/usr/bin/test
y por qué estoy usandobash
ysh
, entonces debe saber que[
es un alias para eltest
comando, que también existe como ejecutable independiente o más comúnmente, como shell incorporado, que es lo que cada shell usará primero . En cuanto a lasif
declaraciones, operan en las estatuas de salida de los comandos, por lo tanto, por qué[
ytest
son comandos, y todo lo demás son argumentos para esos comandos: el orden incorrecto de esos argumentos de la línea de comandos conduce a errores.Volviendo al tema: no está claro cómo OP obtuvo el error no relacionado. Sin embargo, en los 3 casos el problema es el mismo: la variable no establecida se tratará como vacía, por lo tanto, lo que el shell ve con estas variables no citadas es
que rompe la sintaxis que
test
entiende. ¿Recuerdas lo que dije sobre el orden incorrecto de los argumentos de la línea de comandos? Por eso es importante citar. Habilitemos la salida de diagnóstico y veamos qué shell se ejecuta:Mejor manera de probar variables no establecidas
Un enfoque muy frecuente que ves alrededor es este:
Para citar a Gilles :
Presumiblemente, esto debería ser bastante portátil ya que los he visto en
/bin/sh
scripts. También se puede combinar como enPor supuesto, podríamos usar la
-z
bandera, sin embargo, según la investigación en algunos shells, particularmente ksh88 (según Stephane Chazelas ), esta bandera es defectuosa.Ver también
\[
vs\[\[
vs((
fuente
Creo que el título de la publicación no es exacto, ya que la intención en el mensaje era verificar si $ 1 y $ 2 no son nulos. El ejemplo dado solo faltaba comillas dobles en $ 1 y $ 2 para funcionar. Las variables deben estar entre comillas dobles para expandirse al comparar cadenas. Pero verificar si existen $ 1 y $ 2 es lo mismo que verificar si existen $ 2, ya que no puede existir si $ 1 no existe. El comando 'if' tampoco es necesario en este caso, ya que 'test' devuelve verdadero / falso y usa '&&' como 'entonces' si return es 0 / verdadero:
Más simple, con -n (distinto de cero):
"Verificar si $ 1 y $ 2 son nulos" sería lo mismo que verificar si no hay ningún parámetro:
fuente