Yanıtlar:
Atama yok değil aslında var, yeni satır karakterleri kaldırın echo
bunu. 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 echo
daha çok şeylerin bir kombinasyonu, komuta.
Bir komut satırı verildiğinde bash
, IFS
değ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 echo
belgelerle birleştirin ( bash
dahili 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 x
değ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 count
işlev , verilen bağımsız değişkenlerin sayısını yazdırır. 1 2 3
Ve a b c d
varyantları 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ı envdir
program, bunu yapmanın kolay bir yolunu sağlar. envdir
ortam 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.