Katakanlah saya memiliki dua variabel dalam bash:
MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"
Saya ingin mendeteksi ketika suatu variabel benar-benar berisi lebih dari satu baris teks, mengabaikan tambahan karakter baris baru.
Jadi ini:
if [ some test on "$MULTILINE" ]; then echo 'yes'; else echo 'no'; fi
akan dicetak yes
, dan ini:
if [ some test on "$SINGLE_LINE" ]; then echo 'yes'; else echo 'no'; fi
akan dicetak no
.
Untuk kasus spesifik saya, saya pikir saya tidak perlu khawatir tentang memimpin garis kosong, tetapi tidak ada salahnya untuk mengetahui cara melakukannya.
Bagaimana saya bisa melakukan ini?
Jawaban:
Solusi paling sederhana yang saya tahu adalah:
misalnya:
==>
Di atas mengabaikan semua garis kosong: depan, belakang dan interior. Tetapi perhatikan bahwa tidak mungkin memiliki garis dalam interior kecuali jika ada setidaknya dua garis tidak kosong, sehingga keberadaannya tidak dapat mengubah pertanyaan apakah ada lebih dari satu garis setelah pemangkasan garis kosong awal dan belakang.
sumber
Lihat /programming/16414410/delete-empty-lines-using-sed
untuk informasi lebih lanjut tentang cara memotong / menghapus spasi dan menghapus baris menggunakan sed.
Sekarang, tulis
if expression ...
penggunaan Anda$( ... )
di dalam kutipan untuk mendapatkan jumlah baris, dan uji terhadap nomor:sumber
Sedikit modifikasi pada kode ini harus dilakukan. Anda dapat memasukkannya ke dalam skrip sendiri untuk digunakan kembali seperti ini:
Kemudian Anda dapat menggunakannya seperti itu (dengan asumsi bahwa Anda menamai skrip sebelumnya
multiline-check.sh
):sumber
fi
. Sayangnya, saya terjebak di bash 3.1 (versi msysgit). Saya tidak melihat apa pun yang tampak seperti kesalahan sintaksis bagi saya, tetapi jelas saya kehilangan sesuatu. Pikiran?Mengabaikan garis kosong yang tertinggal
Berikut ini adalah pendekatan menggunakan
awk
:Bagaimana itu bekerja:
gema "$ TEST"
Ini mengambil variabel shell apa pun yang kami tertarik dan mengirimkannya ke standar keluar.
tac
Ini membalik urutan garis sehingga baris terakhir dikembalikan terlebih dahulu. Setelah dieksekusi
tac
, garis trailing menjadi garis terdepan.(Nama
tac
adalah kebalikan daricat
untuk alasan yangtac
melakukan apacat
tetapi sebaliknya.)awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }'
Ini menyimpan nomor baris dari baris non-kosong pertama dalam variabel
f
. Setelah membaca semua baris, ia membandingkanf
dengan jumlah total barisNR
,. jikaf
sama denganNR
, maka kita hanya memiliki satu baris (mengabaikan kosong awal) dan kita keluar dengan kode 0. Jika ada satu atau lebih baris setelah baris kosong pertama, maka ia keluar dengan kode `.&& echo "Found A Single Line"
Jika
awk
keluar dengan kode 0, makaecho
pernyataan dieksekusi.Mengabaikan garis depan dan belakang yang kosong
Dengan membuat satu
awk
variabel tambahan , kita dapat memperluas tes untuk mengabaikan garis depan dan belakang yang kosong:Karena versi
awk
kode ini menangani bagian awal dan akhir kosong,tac
tidak lagi diperlukan.Mengambil
awk
kode satu per satu:first==0 && /./ {first=NR}
Jika variabelnya
first
nol (atau belum disetel) dan garis memiliki karakter, karakter apa pun, lalu setelfirst
ke nomor baris. Setelahawk
selesai membaca baris,first
akan diatur ke nomor baris dari baris pertama yang tidak kosong././ {last=NR}
Jika baris memiliki karakter di dalamnya, maka atur variabel
last
ke nomor baris saat ini. Ketikaawk
selesai membaca semua baris, variabel ini akan memiliki nomor baris dari baris non-kosong terakhir.END{if(first==last){exit 0}; exit 1 }
Ini dieksekusi setelah semua baris telah dibaca. Jika
first
sama denganlast
, maka kita telah melihat nol atau baris yang tidak kosong danawk
keluar dengan kode0
. Kalau tidak, ia keluar dengan kode1
. Script shell dapat menguji kode keluar seperti biasa denganif
pernyataan atau&&
atau||
.sumber