Bash'te kullanıcı girişini dizi olarak nasıl okuyabilirim?


15

Kullanıcı girişini bashkabukta dizi olarak nasıl okuyabilirim ?


Stdin'den okumak istediğini sanıyorum? Cevabım aynı zamanda yürütme ile de çalışacaktır cat war_and_peace.txt | ./array_test.sh.
Stefano Palazzo

Veya basitçe ./array_test.sh < war_and_peace.txt.
Eliah Kagan

Yanıtlar:


14

İşte bunu yapmanın bir yolu:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

Sadece çalıştırırsanız, Ctrl + D (EOF) tuşlarına basıncaya kadar standart girişten okumaya devam eder. Daha sonra, girdiğiniz satırlar girilir my_array. Bazıları bu kodu kafa karıştırıcı bulabilir. Döngünün gövdesi temel olarak diyor my_array = my_array + element.

Bazı ilginç belgeler:


3
read -rbazen oldukça faydalı / önemlidir ... Stefano'nun "yerleşik manpage'i okuma" bağlantısı amacını açıklar ... (ters eğik çizgi yorumunu önlemek için).
Peter.O

10

Bunu kullanarak okuyun:

read -a arr

Ve yazdırma için şunları kullanın:

for elem in ${arr[@]}
do 
  echo $elem
done

4

Ve diziyi her seferinde yeniden oluşturmayan (yine de bash 3.1 veya daha yenisini gerektirir):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

Daha fazla bilgi için http://mywiki.wooledge.org/BashFAQ/001 adresine bakın .

Her zaman olduğu gibi, hata yazmamak için http://mywiki.wooledge.org/BashGuide adresini okuyun ve Gelişmiş bash komut dosyası kılavuzu gibi tldp kılavuzlarından kaçının.


Güzel bağlantılar ... IFSSoruna dikkat çektiğin için teşekkürler . Boş bırakmadan, tüm önde gelen ve sondaki boşlukları 'okur' ... ve tabii ki -rde ...
Peter.O

0

Peki bu tek astarlı;)

arr=( $(cat -) )
echo ${arr[@]}

Düzenle:

İçinde bash,

arr=(val1 val2 ...)

bir diziye atamanın yoludur . Komut ikamesi ile birlikte kullanarak, bunu readdüz bir şekilde gerçekleştirmek için kullanılması mümkün olmayan boru hattından diziler okuyabilirsiniz :

echo -e "a\nb" | read -a arr
echo ${arr[@]}

Bir boru hattının bir alt kabukta çalıştırılabilmesi nedeniyle , bir boru olduğunda hiçbir şey yapmaması nedeniyle hiçbir şey çıktı readvermediğini göreceksiniz stdin, böylece değişken hiç kullanılamayabilir.

Bu cevabın önerdiği yolu kullanarak:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

O verir a byolu basit ve daha düz ileri cevaplarından tarafından verilen herhangi bir geçici daha olan bir borudan bir kabuk değişkeni içine Okuma değerlerinin ve bir boru ayarı değerleri değil sonra bash okundu .


test ettin mi
cmak.fr

@ cmak.fr evet benim için çalışıyor
Quark

@Melebius Bunun bir açıklaması ve bu tek-astarın avantajını ekledim.
JiaHao Xu
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.