Değişkende saklanan çok satırlı dize üzerinden yineleme


17

Bunun gibi şeyler yazmanın kötü olduğunu okudum , bunun for line in $(command)yerine doğru yol görünüyor:

command | while IFS= read -r line; do echo $line; done

Harika çalışıyor. Ama ya yinelemek istediğim , bir komutun doğrudan sonucu değil, bir değişkenin içeriği ise ?

Örneğin, aşağıdaki dosyayı oluşturduğunuzu düşünün quickfox:

The quick brown
foxjumps\ over -
the
lazy ,
dog.

Böyle bir şey yapabilmek istiyorum:

# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect

Yanıtlar:


19

Bash ve zsh gibi modern kabuklarda, bir dizeyi giriş olarak kabul eden çok kullanışlı bir `` <<< '' yönlendiriciniz var. Yani yapardın

while IFS= read -r line ; do echo $line; done <<< "$variable"

Aksi takdirde, her zaman

echo "$variable" | while IFS= read -r line ; do echo $line; done

Maalesef, içeriğin yankılanmasını düşünmeliydim. Ama yine de hızlı cevap için teşekkürler!
Sheljohn

1
kullandığınızda çift alıntı $variableyapmanız gerekir, aksi takdirde whiledöngü yalnızca bir giriş satırı alır. Bkz. Örneğin, echo $variablevs echo "$variable"veya cat <<< $variablevs arasındaki çıkış farkı cat <<< "$variable".
cas

@cas Aslında $ değişken içinde ne bağlıdır. OP tarafından sunulan durumda ("değişken = $ (cat quickfox)") ek tırnak işaretleri olmadan çalışır. Ama genel durum için haklısın. Cevabımı düzenlerim. Teşekkürler.
lgeorget

variable=$(cat quickfox)OP'ın Söz konusu kendisi ben bahsettiğini bir örneğini sunmaktadır. Bunu $variableçift ​​tırnak içinde kullanmak yeni satırları içerir, olmadan kullanmak yeni satırlar kabuk tarafından boşluklara çevrilir. Satır satır okuyor ve işliyorsanız, bu büyük bir fark yaratır - ilkinde birden çok giriş satırınız vardır, ikincisi sadece bir giriş satırınız vardır. Girdi verileri yüzeysel olarak benzerdir ancak pratikte bu iki durumda tamamen farklıdır.
cas

örneğin: bu giriş verileriyle cat <<< "$variable" | wc -l5. cat <<< $variable | wc -ldöndürür. 1 döndürür. Bir değişkende boşluk (yeni satırlar, sekmeler, tek veya birden çok boşluk dahil) korumak istiyorsanız / gerekiyorsa, değişkeni kullandığınızda iki kez alıntı yapmanız gerekir, aksi takdirde hepsi her "kelime" arasında tek bir boşluğa dönüştürülecek.
cas
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.