Komut çıktısını bir değişkene saklarken satır sonları nasıl korunur?


104

Linux'ta bash kabuğu kullanıyorum. Bu basit senaryoya sahibim ...

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

Ancak, bu komut dosyasını çalıştırdığımda

./temp.sh

tüm çıktı satır başları / yeni satırlar olmadan yazdırılır. Çıktıyı $ TEMP'e mi yoksa echo komutunun kendisine mi depoladığımdan emin değilim.

Komutun çıktısını bir değişkene nasıl saklayabilirim ve satır sonlarını / satır başlarını nasıl koruyabilirim?


3
Değişkende gayet iyi korunurlar (sonuncusu hariç); kırık olan yankınızdır. Mywiki.wooledge.org/BashPitfalls giriş # 14'e bakın
Charles Duffy

1
Ayrıca, don'tmağaza commandsiçinde variables. UseBir functionyerine
han yalnız

Yanıtlar:


204

Alıntı senin değişkenleri. İşte nedeni:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Tırnak işaretleri olmadan, kabuk $TEMPiçerdiği karakterlerle (biri yeni satır) değiştirir. Ardından, echokabuğu çağırmadan önce, bu dizeyi Internal Field Separator(IFS) kullanarak birden çok argümana böler ve sonuçta ortaya çıkan argüman listesini öğesine iletir echo. Varsayılan olarak, IFSboşluklar (boşluklar, sekmeler ve satırsonları) olarak ayarlanmıştır, bu nedenle kabuk $TEMPdizenizi bağımsız değişkenlere böler ve hiçbir zaman yeni satırı görmez, çünkü kabuk onu bir boşluk gibi bir ayırıcı olarak kabul eder.


xdotool type "$myVar"çalışmıyor. hala değişkenin içeriğini yeni satırlar olmadan
yazıyor

Ya şöyle bir şey yapmak istersen FOO="$(echo $VAR)"; $VARzaten tırnak içindeyken nasıl doğru şekilde alıntı yaparsınız ?
weberc2

@ weberc2 Sadece tekrar alıntı: "$(echo "$VAR")". Evet, ayrıştırmak garip ama görünüşe göre mermiler için bizden daha kolay.
OJFord

3

Aynı problemle karşılaştım, bir alıntı yardımcı olacak

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

2
Yaklaşık 5 yıl sonra bir soruyu önceki cevaplara yeni ayrıntılar eklemeden cevaplamak veya yeni bir çözüm sağlamak iyi bir fikir değildir; lütfen bu tür yanıtları göndermekten kaçının.
MAChitgarha

1
"Neredeyse 5 yılın" hassasiyetini seviyorum, @MAChitgarha, :)
Neil Gaten10
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.