Yanıtlar:
Atama yok değil aslında var, yeni satır karakterleri kaldırın echobunu. Bu satırsonlarını korumak için dizenin etrafına tırnak işareti koymanız yeterlidir:
echo "$testvar"
Bu, istediğiniz sonucu verecektir. Demo için aşağıdaki transkripte bakın:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
Nedeni yeni satırlar boşluk ile değiştirilir neden değil tamamen ilgisi echodaha çok şeylerin bir kombinasyonu, komuta.
Bir komut satırı verildiğinde bash, IFSdeğişkenin belgelerine göre onu kelimelere ayırır :
IFS: Genişletmeden sonra sözcük ayırma için kullanılan Dahili Alan Ayırıcı ... varsayılan değer şudur
<space><tab><newline>.
Bu, varsayılan olarak, bu üç karakterden herhangi birinin komutunuzu ayrı kelimelere bölmek için kullanılabileceğini belirtir. Ondan sonra, kelime ayırıcılar gitti, kalan tek şey bir kelime listesi.
Bunu echobelgelerle birleştirin ( bashdahili bir komut) ve boşlukların neden çıktı olduğunu göreceksiniz:
echo [-neE] [arg ...]: Boşluklarla ayrılmış bağımsız değişkenleri , ardından bir satırsonu ile çıktılar .
Kullandığınızda echo "$x", tüm xdeğişkeni göre tek bir kelime olmaya zorlar bash, dolayısıyla bölünmez. Bunu şununla görebilirsiniz:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Burada countişlev , verilen bağımsız değişkenlerin sayısını yazdırır. 1 2 3Ve a b c dvaryantları eylem göstermek.
Sonra bunu değişken üzerindeki iki varyasyonla deneriz x. Tek olmadan dört kelime vardır tırnak gösterileri, "test", "1", "test"ve "2". Tırnak ekleme yapar bir tek kelime "test 1\ntest 2".
Bu, satırsonu içeren IFS (Dahili Alan Ayırıcı) değişkeninden kaynaklanmaktadır.
$ cat xx1
1
2
$ A=`cat xx1`
$ echo $A
1 2
$ echo "|$IFS|"
|
|
Geçici bir çözüm, IFS'yi yeni satırı içermeyecek şekilde geçici olarak sıfırlamaktır :
$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK
IFS için bu korkunç değişikliği GERİ DÖNMEK için:
IFS=$IFSBAK
echo "$(IFS=''; cat text.txt)"
Bash -ge 4, satırları standart girdiden bir dizi değişkenine okumak için mapfile yerleşikine sahiptir.
help mapfile
mapfile < file.txt lines
printf "%s" "${lines[@]}"
mapfile -t < file.txt lines # strip trailing newlines
printf "%s\n" "${lines[@]}"
Ayrıca bakınız:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
Değişkeniniz tarafından doğru bir şekilde ayarlandı testvar=$(cat test.txt). Yeni satır karakterlerinden oluşan bu değişkeni görüntülemek için, basitçe çift tırnak ekleyin, örn.
echo "$testvar"
İşte tam örnek:
$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2
Yardımcı envdirprogram, bunu yapmanın kolay bir yolunu sağlar. envdirortam değişkenlerini temsil etmek için dosyaları kullanır; dosya adları env var adlarıyla ve dosya içeriği env var değerleriyle eşleşir. Dosya içeriği satırsonu içeriyorsa, env var.