Tugas tidak menghapus karakter baris baru, sebenarnya echo
melakukan 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 echo
perintah, melainkan kombinasi dari hal.
Saat diberi baris perintah, bagi bash
menjadi kata-kata sesuai dengan dokumentasi untuk IFS
variabel:
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 echo
dokumentasi ( bash
perintah 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 x
variabel 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, count
fungsinya hanya mencetak jumlah argumen yang diberikan. The 1 2 3
dan a b c d
varian menunjukkan dalam tindakan.
Kemudian kami mencobanya dengan dua variasi pada x
variabel 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"
.
Hal ini disebabkan oleh variabel IFS (Internal Field Separator) yang berisi baris baru.
Solusinya adalah mengatur ulang IFS agar tidak memuat baris baru, untuk sementara :
Untuk MENGEMBALIKAN perubahan mengerikan ini untuk IFS:
sumber
echo "$(IFS=''; cat text.txt)"
Bash -ge 4 memiliki mapfile builtin untuk membaca baris dari input standar ke dalam variabel array.
Lihat juga:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
sumber
Hanya jika seseorang tertarik dengan opsi lain:
sumber
Variabel Anda disetel dengan benar oleh
testvar=$(cat test.txt)
. Untuk menampilkan variabel ini yang terdiri dari karakter baris baru, cukup tambahkan tanda kutip ganda, misBerikut contoh lengkapnya:
sumber
The
envdir
utilitas menyediakan cara mudah untuk melakukan hal ini.envdir
menggunakan file untuk mewakili variabel lingkungan, dengan pemetaan nama file ke nama env var, dan pemetaan konten file ke nilai env var. Jika isi file berisi baris baru, begitu juga dengan env var.Lihat https://pypi.python.org/pypi/envdir
sumber