2012-01-04 8 views
16

Aquí está mi código de shell simple. Quiero que el resultado sea 2.Shell trata todo como una cadena. ¿Cómo puedo hacer esto?Además del entero en shell

num=1 
num=$(($num + 1)) 

EDIT:

Código completo: ¿Qué de malo en esto si quiero imprimir de 1 a 10?

#! /bin/bash 

num=1 
until test $num -eq 10 
do 
    num=$(($num + 1)) 
    echo $num 
done 
+0

Cambio 'hasta eq num prueba 10' a' hasta que el ensayo $ num eq 10'! Es todo sobre $$ !! –

+0

En primer lugar, la primera vez que echo num ya es 2, cambie 'num = 1' por' num = 0' que debería imprimir todos los números b/w 1 y 10 inclusive 1 y 10 + la corrección provista por Fredrik –

+0

Eliminando esto sería injusto para las personas que se tomaron su tiempo para responder su pregunta. – NullUserException

Respuesta

-1

funciona para mí

$ num=1 
$ num=$(($num + 1)) 
$ echo $num 
2 

Qué salida se puede conseguir?

Leer más sobre aritmética fiesta @tldp

EDITAR

hacer algo 10 veces en bash se puede utilizar (usando brace-expansion}

$ for i in {1..10}; do echo $i; done 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Sin embargo, no se puede utilizar variables entre el {} . Si este es el caso, use seq en su lugar.

+0

-1 El shebang no está mal. Los espacios en blanco después de shebang están bien. – dogbane

+0

demasiado rápido allí, solucionado –

1

Usted acaba de hacer:

$ num=1; num=$(($num + 1));echo $num 
2 

Nota: No es necesario citar las variables dentro $(()). Además, sólo puede utilizar $((num++))

0

probar esto

$ num=1; num=`expr $num + 1`; echo $num; 
+0

lo he comprobado funciona num = 1; num = 'expr $ num + 1'; echo $ num; – vkantiya

0

Uso ((num++)) como abreviatura para incrementar num.

$ num=1 
$ ((num++)) 
$ echo $num 
2 
-1

Usted puede usar algo como:

num=1 
num=`expr $num + 1` 

También se trabajará con conchas no de bash, como ksh.

+1

Esto no funcionará. '$?' es el estado de salida del último comando que es 0. – dogbane

+0

Oh, correcto, un copiar/pegar incorrecto. Corregí – tonio

0

no especifica qué shell que está utilizando, pero la forma más concisa que sé es este (que funciona al menos en bash):

num=$[num+1] 

Si tan sólo por incremento a uno y el cambio de la variable en sí más que imprimir/asignar, entonces:

((num++)) 

Es una solución mejor/más elegante. Ver la respuesta de dogbane para eso.

Si bucle sobre los valores, me gustaría utilizar esta forma en su lugar:

for i in `seq 1 10`; do 
    echo $i 
done 
+1

para el bucle Prefiero '{1..10}' en lugar de invocar 'seq'. – dogbane

2

@tonio; por favor, no defienda el uso de construcciones subshell (`... o $ (...)) cuando no sean necesarias (para mantener la confusión al máximo, $ ((...)) no es una construcción sub-shell) Las subcapas pueden tener un gran rendimiento incluso con cantidades de datos bastante triviales. Lo mismo es cierto para cada lugar donde se usa un programa externo para hacer algo que se puede hacer con un shel incorporado.

Ejemplo:

num=1 
    time while [[ $num -lt 10000 ]]; do 
      num=$((num+1)) 
    done 
    echo $num 
    num=1 
    time while /bin/test $num -lt 10000; do 
      num=$(/bin/expr $num + 1) 
    done 
    echo $num 

salida (pista en ksh en Linux):

 
real 0m0.04s 
user 0m0.04s 
sys  0m0.01s 
10000 

real 0m20.32s 
user 0m2.23s 
sys  0m2.92s 
10000 

... así que en tiempo de ejecución del factor de 250, y el factor de tiempo de CPU de 100. Admito el ejemplo que utilicé fue exagerado, requiriendo explícitamente que se omitieran todos los complementos, pero creo que el punto fue expresado: la creación de nuevos procesos es costosa, evítela cuando pueda y conozca su caparazón para reconocer dónde están los nuevos procesos. creado.

+0

En mi sistema (Debian) ** test ** y ** expr ** están en **/usr/bin ** en su lugar. – dimir

+0

Los problemas de ruta son otra razón para favorecer las incorporaciones de shell, sobre los ejecutables externos. Incluso el sector Linux está tan fragmentado (el código de ejemplo se escribió en un sistema Slackware). –

+0

Puede omitir los corchetes dobles usando 'let':' let num = num + 1' o 'let num ++'. – choroba

1

Esto podría funcionar para usted:

num=1; ((num++)); echo $num 
2 

o

num=1; echo $((++num)) 
2 

para bucles

for num in {1..10}; do echo $num; done 

o (en bash al menos)

for ((num=1; num<=10; num++)) { echo $num; } 

segundo bucle más útil cuando hay más de programación que se trate:

for ((num=1,mun=10; num<=10; num++,mun--)) { echo $num $mun; } 
Cuestiones relacionadas