2012-01-04 24 views
16

İşte basit kabuk kodum. Sonucun olmasını istiyorum 2.Shell her şeyi bir ip gibi ele alır. Bunu nasıl yapabilirim?Kabukta tamsayı ekleme

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

DÜZENLEME:

Komple kodu: Sorun ne bu i 1'den 10'a kadar yazdırmak istiyorsanız? bash yılında

#! /bin/bash 

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

Değiştir'! Onun tüm hakkında $$! –

+0

Öncelikle, zaten 2 numarasını tekrarladığınızda, num = 1 'değerini' num = 0 'olarak değiştirin, bu sayede 1/10 1 ve 10 dahil olmak üzere tüm sayıları bastırabilirsiniz 1 ve 10 + Fredrik tarafından sağlanan düzeltme –

+0

Silme Bu, sorunuzu cevaplamak için zamanlarını alan insanlara haksızlık olur. – NullUserException

cevap

-1

eserler Ne çıktı alabilirim?

tldp

bash 10 kez kullanabilirsiniz şey yapmak DÜZENLEME @ bash Aritmetik hakkında daha fazlasını okuyun (brace-expansion}

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

Ancak kullanarak, sen {} arasındaki değişkenleri kullanamıyorum Durum buysa, seq kullanın.

+0

-1 Shebang yanlış değil. Shebang'den sonra boşluklar iyi. – dogbane

+0

çok hızlı orada, sabit –

1

You Sadece yaptı: Sen $(()) içindeki değişkenleri alıntı gerekmez:

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

Not. Ayrıca, sadece $((num++))

0

num artırma için kısaltma olarak bu

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

kontrol ettim o num = 1 çalışır; num = 'expr $ num + 1 '; echo $ num; – vkantiya

0

kullanın ((num++)) deneyin kullanabilirsiniz. Ayrıca ksh gibi, sigara bash kabukları ile çalışacaktır

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

:

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

Sen gibi bir şey kullanabilirsiniz. Sen belirterek değildir

+1

Bu işe yaramaz. '$?', son komutun çıkış durumu olan 0'dır – dogbane

+0

Oh, doğru, yanlış kopyala/yapıştır. Döngü için – tonio

0

kullandığınız kabuk, ama bildiğim en özlü formu bu bir (en azından bash çalışır) geçerli:

num=$[num+1] 

ise sadece birer artan ve oldukça değişken üzerinde değişiklik yazdırma/atama, daha sonra:

((num++)) 

Daha iyi/daha zarif bir çözümdür. Bunun için dogbane'nın cevabını görün.

değerler üzerinde döngü, ben bu formu kullanın istiyorsanız:

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

düzeltildi 'seq' yerine çağırmak yerine {1..10}' tercih ederim. – dogbane

2

@tonio; gerekmediklerinde subshell (`... veya $ (...)) yapıları kullanmayı savunmayın (karışıklığı en yüksek seviyede tutmak için $ ((...)) alt kabuk yapı değildir.). Alt-kabuklar, oldukça önemsiz miktarda veriyle bile inanılmaz bir performans yakalayabilir. Aynısı, dahili bir raf ile yapılabilecek bir şey yapmak için harici bir programın kullanıldığı her yer için de geçerlidir.

Örnek:

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 

Çıkış (Linux üzerinde ksh koşmak):

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

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

... İtiraf 100 kadar 250 çalışma zamanı faktörü, ve CPU-zaman faktörü Kullandığım örnek abartılı biriydi, açıkça tüm yerleşiklerin atlanmasını gerektiriyordu, ama sanırım bu nokta yapıldı: yeni süreçler yaratmak expenisve, yapabileceğiniz zaman kaçının ve kabuğunuzun yeni süreçlerin nerede olduğunu bilmesini sağlayın. yarattı.

+0

Sistemimde (Debian) ** test ** ve ** expr ** yerine **/usr/bin ** yazılmıştır. – dimir

+0

Yol sorunları, dış yürütücüler üzerinde, kabuk yerleşik öğelerini desteklemenin başka bir nedenidir. Linux sektörü bile çok parçalıdır (örnek kod bir Slackware sisteminde yazılmıştır). –

+0

let let': 'num num = num + 1' veya' num num ++ 'tuşlarını kullanarak çift parantezleri çıkartabilirsiniz. – choroba

1

Bu sizin için işe yarayabilecek:

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

ya da (bash en azından) döngüler

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

ya yönelik

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

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

ikinci döngü daha kullanışlı daha programlama dahil olduğunda: `Test $ num -eq kadar 10` test num -eq 10` kadar

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