Saya ingin menulis beberapa teks yang telah ditentukan ke file dengan yang berikut ini:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
Saya mengharapkan sesuatu seperti ini:
this is line one
this is line two
this is line three
Tapi dapatkan ini:
this is line one
this is line two
this is line three
Saya yakin tidak ada ruang setelah masing-masing \n
, tetapi bagaimana ruang ekstra keluar?
text="this is line one\nthis is line two\nthis is line three"
satu baris yang sama ..? (tanpa masukkan)\n
di setiap baris, Anda telah menekan baris baru untuk pindah ke baris baru\n
.Jadi mengapa Anda menempatkan baris berikutnya di baris baru? Sederhananyatext="this is line one\nthis is line two\nthis is line three"
\n
pada akhir setiap baris menyebabkan output semua berjalan bersama pada satu baris."$text"
di dalam garis gema sangat penting. Tanpa mereka, tidak ada baris baru (baik literal maupun '\ n') yang berfungsi. Dengan mereka, mereka semua melakukannya.Jawaban:
Heredoc terdengar lebih nyaman untuk tujuan ini. Ini digunakan untuk mengirim banyak perintah ke program juru bahasa perintah seperti ex atau cat
String setelah
<<
menunjukkan di mana harus berhenti.Untuk mengirim baris ini ke file, gunakan:
Anda juga bisa menyimpan garis-garis ini ke variabel:
Ini menyimpan garis ke variabel bernama
VAR
.Saat mencetak, ingat tanda kutip di sekitar variabel jika tidak, Anda tidak akan melihat karakter baris baru.
Bahkan lebih baik, Anda dapat menggunakan lekukan untuk membuatnya lebih menonjol dalam kode Anda. Kali ini tambahkan saja
-
setelah<<
untuk menghentikan tab agar tidak muncul.Tetapi kemudian Anda harus menggunakan tab, bukan spasi, untuk lekukan dalam kode Anda.
sumber
-d
opsi dalamread -r -d '' VARIABLE <<- EOM
tidak berhasil untuk saya.Jika Anda mencoba memasukkan string ke dalam variabel, cara mudah lainnya adalah seperti ini:
Jika Anda membuat indentasi string Anda dengan tab (yaitu, '\ t'), indentasi akan dilucuti. Jika Anda indentasi dengan spasi, indentasi akan dibiarkan masuk.
CATATAN: Ini adalah penting bahwa penutupan kurung terakhir adalah pada baris lain. The
END
teks harus muncul pada baris dengan sendirinya.sumber
)
di baris yang sama. Saya pikir itu karena apa yang terjadi di antara$(
dan)
akan dieksekusi di alam semesta sendiri, dan perintah yang sebenarnya tidak akan melihat ')'. Saya ingin tahu apakah itu bekerja untuk orang lain juga.echo
menambahkan spasi di antara argumen yang diteruskan ke sana.$text
dikenakan ekspansi variabel dan pemisahan kata, sehinggaecho
perintah Anda setara dengan:Anda dapat melihat bahwa spasi akan ditambahkan sebelum "ini". Anda dapat menghapus karakter baris baru, dan mengutip
$text
untuk mempertahankan baris baru:Atau Anda bisa menggunakan
printf
, yang lebih kuat dan portabel daripadaecho
:Di
bash
, yang mendukung ekspansi brace, Anda bahkan dapat melakukan:sumber
dalam skrip bash bekerja sebagai berikut:
kalau tidak:
nama file kucing memberi:
sumber
-e
opsi untukecho
. Silakan coba lagi.Saya telah menemukan lebih banyak solusi karena saya ingin setiap baris diindentasi dengan benar:
Anda dapat menggunakan
echo
:Ini tidak berfungsi jika Anda meletakkan
"\n"
sebelum\
di ujung baris.Atau, Anda dapat menggunakan
printf
untuk portabilitas yang lebih baik (saya kebetulan memiliki banyak masalah denganecho
):Namun solusi lain mungkin:
atau
Solusi lain dicapai dengan mencampur
printf
dansed
.Tidak mudah untuk memperbaiki kode yang diformat seperti ini saat Anda memasukkan kode indentasi ke dalam kode.
Dimungkinkan untuk menggunakan fungsi pembantu dan beberapa trik substitusi variabel:
sumber
Berikut ini adalah cara yang saya sukai untuk menetapkan string multi-line ke variabel (saya pikir itu terlihat bagus).
Jumlah garis bawah adalah sama (di sini 80) dalam kedua kasus.
sumber
Hanya untuk menyebutkan penggabungan satu baris sederhana karena dapat bermanfaat kadang-kadang.
Anda akan mendapatkan sesuatu seperti ini
Semua ruang putih utama dan akhir akan dipertahankan dengan benar
sumber
Ada banyak cara untuk melakukannya. Bagi saya, memasukkan string ke dalam sed bisa berfungsi dengan baik.
Jawaban ini didasarkan pada jawaban Mateusz Piotrowski tetapi sedikit disempurnakan.
sumber
itu akan berfungsi jika Anda meletakkannya seperti di bawah ini:
sumber