2011-02-10 16 views
6

Sıra numaralı bir değişken olduğunda, Bash'te yerleşik sekanslarla (yani: seq kullanmama) bir sorun yaşıyorum. do yankı $; i {1 .. $ a} için;Başlıklardaki genişleme ve değişken dizileri

bash-3.2 $ a = 3: Örneğin, bu işler ve 1 2 3 me yazdırmak: Bu

for i in {1..3};do echo $i;done 

ama i; başarısız ve baskı

yapılması beni {1..3} sadece

Bu ZSH ile çalışır ve ben bir sayaç şey yapmak alternatif ama biliyorum bu bir hata ya da bir bağ olup olmadığını merak genişleme özelliği!

+1

olası yinelenen http://stackoverflow.com/ sorular/4764383/argümanlar-in-için-in-bas-in-bash-script) –

cevap

4

, destek genişletme değişken genişleme önce gerçekleştirilir. Sipariş için bkz. Shell Expansions.

$ a=7; echo {1..3} {4..$a} 
1 2 3 {4..7} 

bir değişken kullanmak istiyorsanız

, Shawn yanıtında olduğu gibi, C-stile for döngüler kullanın.

$ start=3 
$ end=5 
$ echo {$(echo $start)..$(echo $end)} 
3
$ num=3 
$ for i in $(eval echo {1..$num});do echo $i;done 
1 
2 
3 
+0

bana bir kesmek gibi gözüküyor ... ama teşekkürler .. –

+0

C tarzı döngü daha az verimli (kullanımı nedeniyle bir subshell) ve bir güvenlik riski taşımaktadır: "eval" işlevini kullanmıyorsanız, "eval" komutunu kullanıp kullanmıyorsanız, "eval" işlevini kullanmayın. Aksi halde, keyfi komutlar çalıştırılabilir. Örneğin, şu dikkatle hazırlanmış '$ num' değeri şu anki kullanıcının ana klasöründeki dosyaları numaralandıracaktır: 'num = '}; ls ~; {'; $ için (eval echo {1 .. $ num}); echo $ i; done ' – mklement0

4

alternatif bir C tarzı döngüler izin veren, ikili-parantez yapısı kullanmak olacaktır: Bash

A=3 
for ((i=1; i<=$A; i++)); do 
    echo $i 
done 
+0

Merhaba, ben harici komut ama iç bash yerleşimi kullanarak ilgilenmiyorum. –

+0

o seq' kullanmak istemiyor – kurumi

+0

Üzgünüz, bunu kaçırdı. Güncelleme yanıtı. –

1

Diğer seçenek seq komutu kullanmaktır

n = bazı numarası; {1 .. $ n..increment} yüzden bu geçici çözümü kullanılan

:

n=100 
i=1 
while [ $i -lt $n ] 
do 
echo $i 
i=$(($i+1)) 
done 
[bash komut döngü içine geçirilen argümanlar] (içinde
+0

Harici bir yardımcı programın kullanımı nedeniyle verimli değil, ancak basit ve işe yarıyor. – mklement0

-1

bu deneyin:

+1

Bu, aşağıdaki _literal_: '{3..5}' yazdıran, ki bu açıkça amaç değil. Bağlantıyı kabul edilen yanıtta takip ederseniz, brace genişlemesinin ('{...}') _before_ komut değiştirmesi ('$ (...)') olduğunu görürsünüz. _Bash_, etiketlendiği gibi, Ksh ve Zsh'te _would_ çalışır, ancak burada zaten brace genişletmelerde _directly_ değişkenlerini kullanabilirsiniz, böylece sadece 'start = 3 end = 5; echo {$ start .. $ end}') . – mklement0

+0

Üzgünüm, bir hata yaptım, echo {$ (echo $ başlangıç) .. $ (echo $ end)} çalışmıyor, ancak {$ start, $ end} "3 5" çıktılar. –

+0

Evet, öyle, ancak bu, brace genişletmenin _list_ formudur (',' -separated items), oysa OP'nin aradığı _sequence_ (range) formudur ('..'). Somut olarak: '3 5' değil, istenen çıktı, '3 4 5'. – mklement0

0

Ben de böyle somenthing yapmak için gerekli:

a=3; for i in $(seq 1 $a);do echo $i;done