Tugas tidak menghapus karakter baris baru, sebenarnya echomelakukan ini. Anda hanya perlu memberi tanda kutip di sekitar string untuk mempertahankan baris baru tersebut:
echo "$testvar"
Ini akan memberikan hasil yang Anda inginkan. Lihat transkrip berikut untuk demo:
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
The Alasan mengapa baris diganti dengan spasi tidak sepenuhnya dilakukan dengan echoperintah, melainkan kombinasi dari hal.
Saat diberi baris perintah, bagi bashmenjadi kata-kata sesuai dengan dokumentasi untuk IFSvariabel:
IFS: Pemisah Bidang Internal yang digunakan untuk pemisahan kata setelah perluasan ... nilai defaultnya adalah <space><tab><newline>.
Itu menentukan bahwa, secara default, salah satu dari tiga karakter tersebut dapat digunakan untuk membagi perintah Anda menjadi kata-kata individual. Setelah itu, kata pemisah hilang, yang tersisa hanyalah daftar kata.
Gabungkan itu dengan echodokumentasi ( bashperintah internal), dan Anda akan melihat mengapa spasi adalah keluaran:
echo [-neE] [arg ...]: Keluarkan args, dipisahkan oleh spasi, diikuti oleh baris baru.
Saat Anda menggunakannya echo "$x", ini memaksa seluruh xvariabel menjadi satu kata bash, oleh karena itu tidak dipecah. Anda dapat melihatnya dengan:
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
Di sini, countfungsinya hanya mencetak jumlah argumen yang diberikan. The 1 2 3dan a b c dvarian menunjukkan dalam tindakan.
Kemudian kami mencobanya dengan dua variasi pada xvariabel tersebut. Yang tanpa tanda kutip menunjukkan bahwa ada empat kata, "test", "1", "test"dan "2". Menambahkan tanda kutip menjadikannya satu kata tunggal "test 1\ntest 2".