Kullanıcı girişini bashkabukta dizi olarak nasıl okuyabilirim ?
./array_test.sh < war_and_peace.txt.
Kullanıcı girişini bashkabukta dizi olarak nasıl okuyabilirim ?
./array_test.sh < war_and_peace.txt.
Yanıtlar:
İş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:
Gelişmiş Bash-Komut Kılavuzu büyük sahiptir diziler bölümüne
Ait manpage okuma yerleşiğini
Thegeekstuff.com'dan 15 dizi örneği
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).
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.
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 ...
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 .
cat war_and_peace.txt | ./array_test.sh.