2009-01-03 46 views

Respuesta

1

Su pedazo de script funciona genial. ¿Estás seguro de que no estás asignando nada más antes del if a "i"?

Un error común tampoco es dejar un espacio después y antes de los corchetes.

6

A juzgar por el mensaje de error el valor de i fue la cadena vacía cuando se lo ejecuta, no 0.

242

Su problema surge del hecho de que $i tiene un valor en blanco cuando su estado de falla. citan siempre sus variables cuando se realizan comparaciones si hay la más mínima posibilidad de que uno de ellos puede estar vacío, por ejemplo .:

if [ "$i" -ge 2 ] ; then 
    ... 
fi 

Esto es debido a cómo las variables shell trata. Supongamos que el ejemplo original,

if [ $i -ge 2 ] ; then ... 

Lo primero que hace la shell al ejecutar esa línea de código en particular es sustituir el valor de $i, al igual que de búsqueda de su editor favorito & reemplazar la función haría. Asuma que $i está vacío o, incluso más ilustrativo, suponga que $i es un montón de espacios. El intérprete de comandos sustituirá $i de la siguiente manera:

if [  -ge 2 ] ; then ... 

Ahora que las sustituciones de variables se realizan, las ganancias de concha con la comparación y .... falla porque no puede ver nada inteligible a la izquierda de -gt. Sin embargo, citando $i:

if [ "$i" -ge 2 ] ; then ... 

se convierte en:

if [ " " -ge 2 ] ; then ... 

La cáscara ahora ve las comillas dobles, y sabe que en realidad se está comparando cuatro espacios en blanco a 2 y se omitirá la if.

También tiene la opción de especificar un valor predeterminado para $i$i si está en blanco, de la siguiente manera:

if [ "${i:-0}" -ge 2 ] ; then ... 

Esto sustituir el valor 0 en lugar de $i es $i no está definido. Sigo manteniendo las comillas porque, de nuevo, si $i es un montón de espacios en blanco, entonces no cuenta como undefined, no se reemplazará con 0, y se encontrará con el problema una vez más.

Lea this cuando tenga el tiempo.Muchas personas ven el caparazón como una caja negra, pero funciona con muy pocas y muy simples reglas: una vez que conoces cuáles son esas reglas (una de ellas es cómo funcionan las variables en el caparazón, como se explicó anteriormente), el caparazón no tengas más secretos para ti.

+4

citando variables se levantará un nuevo error como ** ** expresión entera espera –

+0

@ Néstor ** ** incorrecta, citando a una variable no va a levantar un nuevo error como * expresión entera espera * si la variable es numérica; proporcionar un valor de variable no numérico, ya sea cotizado o no, * dará lugar a dicho error. – vladr

+1

Estaba intentándolo en ese momento y obtuve ese error. –

6

Necesito agregar mis 5 centavos. Veo que todos usan [ o [[, pero vale la pena mencionar que no son parte de la sintaxis.

Para las comparaciones aritméticas, use ((...)) en su lugar.

((...)) es un comando de la aritmética, que devuelve un estado de salida 0 si la expresión es diferente de cero, o 1 si la expresión es cero. También se usó como sinónimo de "dejar", si se necesitan efectos secundarios (asignaciones).

Ver: ArithmeticExpression

Cuestiones relacionadas