Saya sedang menulis skrip instalasi yang akan dijalankan sebagai /bin/sh
.
Ada baris yang meminta file:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Saya ingin memecah garis panjang ini menjadi banyak garis sehingga tidak ada yang melebihi 80 karakter. Saya sedang berbicara tentang baris dalam kode sumber skrip; bukan tentang garis yang benar-benar dicetak di layar ketika skrip dieksekusi!
Apa yang saya coba:
Pendekatan Frist:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
Ini tidak berfungsi karena tidak mencetak
Would you like to add this feature? [Y|n]
.Pendekatan kedua:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
Tidak berfungsi juga. Ini mencetak baris baru setelah prompt. Menambahkan
-n
opsi keecho
tidak membantu: hanya mencetak:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Solusi saya saat ini adalah
printf '%s %s ' \ "goat can try change directory if cd fails to do so." \ "Would you like to add this feature? [Y|n] " read REPLY
dan saya bertanya-tanya apakah ada cara yang lebih baik.
Ingatlah bahwa saya mencari /bin/sh
solusi yang kompatibel.
shell
shell-script
string
newlines
bourne-shell
Mateusz Piotrowski
sumber
sumber
Jawaban:
Pertama-tama, mari kita pisahkan membaca dari baris teks dengan menggunakan variabel:
Dengan cara ini masalahnya menjadi: Cara menetapkan dua baris ke variabel.
Tentu saja, upaya pertama untuk melakukan itu, adalah:
Ditulis seperti itu, var
a
benar-benar mendapatkan nilailine-1 line-2
.Tapi Anda tidak suka kurangnya indentasi yang diciptakan ini, well, maka kita dapat mencoba membaca baris ke var dari sini-doc (perlu diketahui bahwa baris indentasi di dalam sini-doc membutuhkan tab, bukan spasi, untuk bekerja dengan benar):
Tapi itu akan gagal karena sebenarnya dua baris ditulis untuk
$a
. Solusi untuk mendapatkan hanya satu baris mungkin:Itu dekat, tetapi menciptakan masalah tambahan lainnya.
Solusi yang benar.
Semua upaya di atas hanya akan membuat masalah ini lebih rumit dari yang seharusnya.
Pendekatan yang sangat mendasar dan sederhana adalah:
Kode untuk contoh spesifik Anda adalah (untuk setiap shell yang
read
mendukungnya-p
):Untuk semua kerang lainnya, gunakan:
sumber
Garis miring terbalik pada akhir baris memungkinkan kelanjutan dari perintah melalui beberapa baris, bukan garis putus aktual dalam output.
Jadi pendekatan pertama Anda, misalnya, menjadi perintah
Saya tidak yakin mengapa Anda ingin membaca untuk menampilkan beberapa baris, tetapi saya hanya akan menggunakan
read
untuk baris prompt danecho
baris sebelumnya.Agar kode lebih mudah dibaca dari banyak baris, jangan tutup / buka tanda kutip antar baris.
Coba ini:
sumber
read
indentasi dalam fungsi maka pendekatan Anda tampaknya mengacaukan keterbacaan.Saya menemukan pendekatan @ BinaryZebra menggunakan variabel untuk menjadi lebih bersih, tetapi Anda juga bisa melakukannya dengan cara yang Anda coba. Anda hanya perlu menjaga jeda baris di dalam tanda kutip:
sumber
\n
prompt saya. Saya hanya ingin memecah kode menjadi beberapa baris sehingga setiap baris paling panjang 80 karakter.Bagaimana dengan ini saja:
sumber