Bagaimana saya bisa menghasilkan string multi baris dalam Bash tanpa menggunakan beberapa panggilan gema seperti:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Saya mencari cara portabel untuk melakukan ini, hanya menggunakan Bash builtins.
echo >&2 ...
--help
(yang harus pergi ke standar keluar).printf
solusi berbasis dari Gordon Davidson. Meskipun berada dalam bayang-bayang pendekatan berbasisecho
ataucat
, tampaknya jauh lebih sedikit dari lumpur. Diakui sintaks `printf 'mewakili sedikit kurva pembelajaran, tetapi saya ingin mendengarkan kelemahan lainnya (kompatibilitas?, Kinerja? ...)Jawaban:
Di sini dokumen sering digunakan untuk tujuan ini.
Mereka didukung di semua shell yang diturunkan dari Bourne termasuk semua versi Bash.
sumber
cat
bukan built-in.read -d '' help <<- EOF ...
untuk membaca string multiline menjadi variabel dan kemudian menggemakan hasilnya.atau Anda dapat melakukan ini:
sumber
Terinspirasi oleh jawaban mendalam pada halaman ini, saya menciptakan pendekatan campuran, yang saya anggap paling sederhana dan lebih fleksibel. Bagaimana menurut anda?
Pertama, saya mendefinisikan penggunaan dalam suatu variabel, yang memungkinkan saya untuk menggunakannya kembali dalam konteks yang berbeda. Formatnya sangat sederhana, hampir WYSIWYG, tanpa perlu menambahkan karakter kontrol. Ini tampaknya cukup portabel untuk saya (saya menjalankannya di MacOS dan Ubuntu)
Maka saya bisa menggunakannya sebagai
atau bahkan lebih baik, ketika parameter parsing, saya bisa menggema di sana dalam satu-liner:
sumber
echo "$__usage"
diperlukan untuk saya.echo $__usage
tidak bekerja.Gunakan
-e
opsi, maka Anda dapat mencetak karakter baris baru dengan\n
di dalam string.Sampel (tetapi tidak yakin apakah bagus atau tidak)
Yang menyenangkan adalah bahwa-e
opsi tidak didokumentasikan di halaman manual MacOS sementara masih dapat digunakan. Itu didokumentasikan di halaman manual Linux .sumber
echo
perintah yang disediakan sistem/bin/echo
, yang pada Mac OS tidak memiliki-e
opsi. saat Anda menggunakan bash pada sistem itu,echo
perintah bawaannya mengambil alih. Anda dapat melihat ini dengan mengetik/bin/echo whatever
dan mengamati perbedaan perilaku secara eksplisit . Untuk melihat dokumentasi untuk built-in, ketikhelp echo
./bin/echo
sering berbeda dari satu OS ke OS lainnya dan berbeda dari Bash's builtinecho
.echo -e
tidak portabel - misalnya, beberapa implementasi gema akan mencetak "-e" sebagai bagian dari output. Jika Anda ingin portabilitas, gunakan printf saja. Sebagai contoh, / bin / echo pada OS X 10.7.4 melakukan ini. IIRC gema built-in bash juga aneh di bawah 10.5.0, tapi saya tidak ingat detailnya lagi.echo -e
telah menggigit saya sebelumnya ... Pasti menggunakanprintf
ataucat
dengan heredoc. The<<-
varian dari sini docs yang sangat baik karena Anda dapat menghapus lekukan terkemuka di output, tapi indent untuk dibaca dalam naskahKarena saya merekomendasikan
printf
dalam komentar, saya mungkin harus memberikan beberapa contoh penggunaannya (walaupun untuk mencetak pesan penggunaan, saya lebih cenderung menggunakan jawaban Dennis atau Chris).printf
sedikit lebih kompleks untuk digunakan daripadaecho
. Argumen pertama adalah string format, di mana lolos (seperti\n
) selalu ditafsirkan; itu juga dapat berisi arahan format yang dimulai dengan%
, yang mengontrol di mana dan bagaimana argumen tambahan dimasukkan di dalamnya. Berikut adalah dua pendekatan berbeda untuk menggunakannya untuk pesan penggunaan:Pertama, Anda bisa memasukkan seluruh pesan dalam string format:
Perhatikan bahwa tidak seperti itu
echo
, Anda harus memasukkan baris akhir final secara eksplisit. Juga, jika pesan tersebut mengandung%
karakter, mereka harus ditulis sebagai%%
. Jika Anda ingin memasukkan laporan bug dan alamat beranda, mereka dapat ditambahkan secara alami:Kedua, Anda bisa menggunakan string format untuk membuatnya mencetak setiap argumen tambahan pada baris terpisah:
Dengan opsi ini, menambahkan laporan bug dan alamat beranda cukup jelas:
sumber
Juga dengan kode sumber indentasi yang dapat Anda gunakan
<<-
(dengan tanda hubung trailing) untuk mengabaikan tab utama (tetapi tidak memimpin spasi). Sebagai contoh ini:Keluaran teks menjorok tanpa spasi putih terkemuka:
sumber
Jika Anda menggunakan solusi dari @jorge dan menemukan bahwa semuanya ada di baris yang sama, pastikan Anda menyertakan variabel dalam tanda kutip:
akan mencetak semuanya pada satu baris sedangkan
akan mempertahankan baris baru.
sumber
cat <<EOF .... EOF
&& echo "$ foo"