2012-01-04 13 views
16

Ecco il mio semplice codice shell. Voglio che il risultato sia 2.Shell tratta tutto come una stringa. Come posso fare?Integer addizione nella shell

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

EDIT:

completo del codice: Cosa c'è di sbagliato in questo, se voglio stampare da 1 a 10?

#! /bin/bash 

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

Change 'fino a prova num eq 10' a' fino a prova $ num eq 10'! È tutto su $$ !! –

+0

In primo luogo, la prima volta che echo num è già 2, quindi cambia 'num = 1' a' num = 0' che dovrebbe stampare tutti i numeri b/n 1 & 10 inclusi 1 e 10 + la correzione fornita da Fredrik –

+0

Eliminazione questo sarebbe ingiusto per le persone che hanno preso il loro tempo per rispondere alla tua domanda. – NullUserException

risposta

-1

funziona per me

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

Cosa uscita si ottiene?

Per saperne di più aritmetica bash @tldp

EDIT

di fare qualcosa di 10 volte in bash è possibile utilizzare (usando brace-expansion}

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

Tuttavia, non è possibile utilizzare le variabili tra il {} Se questo è il caso, utilizzare invece seq.

+0

-1 Lo shebang non è sbagliato. Gli spazi vuoti dopo lo shebang sono OK. – dogbane

+0

troppo veloce lì, fisso –

1

Si appena fatto:

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

Nota: Non è necessario citare le variabili all'interno $(()). Inoltre, si può semplicemente utilizzare $((num++))

0

provare questo

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

lo ho controllato funziona num = 1; num = 'expr $ num + 1'; echo $ num; – vkantiya

0

Usa ((num++)) come abbreviazione per l'incremento num.

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

Si può usare qualcosa di simile a:

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

E funziona anche con le coperture non bash, come ksh.

+1

Questo non funzionerà. '$?' è lo stato di uscita dell'ultimo comando che è 0. – dogbane

+0

Oh, giusto, una copia/incolla non corretta. Correggere – tonio

0

Non si specifica quale shell si sta utilizzando, ma la forma più concisa quello che so è questo uno (funziona almeno in bash):

num=$[num+1] 

Se solo incrementare di uno e modificando la variabile stessa piuttosto di stampa/assegnazione, quindi:

((num++)) 

È una soluzione migliore/più elegante. Vedi la risposta di dogbane per quello.

Se loop sui valori, vorrei utilizzare questo modulo invece:

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

per il ciclo Preferirei '{1..10}' invece di richiamare 'seq'. – dogbane

2

@tonio; per favore non difendere usando costrutti subshell (`... o $ (...)) quando non sono necessari (per mantenere la confusione al massimo, $ ((...)) non è un costrutto sub-shell). Le sub-shell possono fare un enorme successo anche con quantità di dati piuttosto banali. Lo stesso vale per ogni posto in cui un programma esterno è usato per fare qualcosa che potrebbe essere fatto con un built-in shel.

Esempio:

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 

uscita (corsa nel ksh su Linux):

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

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

... così run-time fattore 250, e il fattore tempo di CPU di 100. Ammetto l'esempio che ho usato era esagerato, richiedendo esplicitamente l'esclusione di tutti i built-in, ma penso che il punto sia stato fatto: creare nuovi processi è necessario, evitarlo quando puoi e conoscere la shell per riconoscere dove sono nuovi processi creato.

+0

Nel mio sistema (Debian) ** test ** e ** expr ** sono in **/usr/bin **. – dimir

+0

I problemi relativi ai percorsi sono un altro motivo per favorire gli incorporamenti della shell rispetto agli eseguibili esterni. Anche il settore Linux è così frammentato (il codice di esempio è stato scritto su un sistema Slackware). –

+0

Puoi omettere le doppie parentesi usando 'let':' let num = num + 1' o 'let num ++'. – choroba

1

Questo potrebbe funzionare per voi:

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

o

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

cicli for

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

o (in bash almeno)

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

secondo ciclo più utile quando più di programmazione coinvolti:

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