Değişkenler oluşturma ve döngü (bash) ile değerler atama


12

Bir bash değişkenleri oluşturmanın ve bunları bir döngü aracılığıyla değer atamanın bir yolu var mı?

Çizgileri boyunca bir şey:

#!/bin/bash

c=0
for file in $( ls ); do
    var"$c"="$file";
    let c=$c+1;
done

DÜZENLEME: @Costas ve @mdpc'e bunun bir listeye kötü bir alternatif olacağını belirttiği için teşekkür ederiz; soru sadece teoriktir.


1
NOT: Bunu komut olarak yürütürseniz, kurulumunuzun değişkenleri yalnızca geçerli işlemde değiştireceğini / değiştireceğini / atayacağını unutmayın. Dosyayı '.' Kullanarak kaynaklayabilirsiniz. komutunu (EX:. new_vars) geçerli işlemde gerçekleştirmek için kullanın.
mdpc

Tamam, ama yukarıdaki aslında çalışmıyor çalışmıyor; var"$c"kırıyor. @Costas'ın cevabı, tek bir liste değişkenine birden çok değer atamayı gösterir - Teorik olarak değişkenlerin gerçekten bir döngü ile üretilip üretilemeyeceğini soruyorum .
toxefa

Hmmm ... neden bu kadar karmaşık, sadece yeni bir değişken kullanmak onu herhangi bir hayran olmadan oluşturur.
mdpc

Yanıtlar:


14

Eh, kesinlikle kullanarak yapabilirsiniz eval şöyle:

c=0
for file in $( ls ); do
    eval "var$c=$file";
    c=$((c+1));
done

Bu kod, her biri dosya adını tutan var0, var1, var2, ... adlı değişkenler oluşturur. Bir dizi kullanarak bunu yapmak için iyi bir neden olacağını varsayalım ...


5

Muhtemelen dizi demek istiyorsun. Değer atamanın bazı yolları vardır

İlk:

c=0
for file in $( ls ); do
    var[$c]="$file";
    c=$(($c+1));
done

İkinci:

c=0
for file in $( ls ); do
    var[c++]="$file";
done

Üçüncü:

for file in $( ls ); do
    var[${#var}]="$file";
done

Dördüncü:

var=( $(ls) )

Beşinci

...

  1. Kullanmaya gerek yok ls, sadece *tüm dosyalar için koy
  2. içeride işareti ommited edilebilir[]$

Teşekkür ederim; sorum potansiyel olarak gerçekten pratik olmaktan daha teorik. Ancak, echo $varyukarıda listelediğiniz komutlarla birlikte sadece 'listelenen' ilk dosyayı alırım ls. Yanlış bir şey mi yapıyorum?
toxefa

1
Kullanmanız gereken tüm diziyi echo ${var[*]}(veya ${var[@]}) çıkarmak istiyorsanız , tek bir öğe gibi çağrılabilir echo ${var[1]}. Not: $vareşittir${var[0]}
Costas

1
@ py4on Diğer bir yol döngü kullanmaktır:for v in "${var[@]}";do echo $v;done
Costas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.