Bagaimana saya bisa membuat progress bar dengan bash?
Ini skrip saya:
#!/bin/bash
pass='number1 number12 number13 number14 number15 number16'
chk='number14'
for i in $pass ; do
if [ "$i" == "$chk" ]; then
echo ' Found ^_^'
else
echo 'loading 50%'
fi
done
Saya ingin mengganti echo 'loading 50%'
dengan apa pun untuk membuat bilah kemajuan.
command-line
bash
Elang Hitam
sumber
sumber
eta
mungkin melakukan apa yang Anda inginkan.Jawaban:
whiptail
hadir dengan pra-instal di Ubuntu dan banyak distro lainnya, dan akan menampilkan elemen progres layar penuh (tapi masih berbasis terminal).dialog
adalah superset dariwhiptail
, jadi contoh ini akan bekerja sama baiknya dengan keduanya. Itu memang menyediakan elemen UI yang lebih maju, jadi mungkin berguna jika Anda mencari interaksi pengguna seperti pemetik file dan formulir, tetapi memiliki kelemahan tidak datang diinstal pada banyak sistem.Perhatikan bahwa output skrip ditafsirkan sebagai persentase, jadi Anda mungkin harus menyesuaikan output Anda sesuai.
Whiptail dan Dialog juga memungkinkan Anda untuk memodifikasi teks pada saat dijalankan melalui sintaksis yang agak samar:
pv
menunjukkan progres file atau stream yang disalurkan melalui file tersebut. Namun itu tidak dapat (mudah?) Digunakan untuk menunjukkan kemajuan operasi kustom seperti loop. Ini dirancang khusus untuk streaming.Beberapa contoh dunia nyata
pv
sangat berguna:Saya tidak tahu ada perintah yang memberikan progress bar satu-baris dalam gaya
pv
atauwget
, tetapi ada banyak skrip Bash / Perl / sed sederhana yang akan menambahkan fungsionalitas itu, seperti yang telah dibagikan orang lain di sini.sumber
pv
Anda dapat membuatnya mencari output loop atau membuat beberapa output palsu, misalnya suatuecho
di setiap iterasi, pipa itu kepv
dan berikan dengan iterasi hitungan-s
. Jika tidak diinginkan, ingatlah untuk mengarahkan stdout loop ke/dev/null
. Berikut ini contoh yang menunjukkan pendekatan ini .Anda dapat menggunakan
zenity
untuk membuat jendela dialog GTK sederhana. Salah satu opsi yang tersedia adalah dialog progress bar.Anda membuat jendela seperti itu menggunakan
zenity --progress
. Agar bermanfaat, Anda harus menentukan lebih banyak informasi dengan menambahkan beberapa opsi di bawah ini (kutipan dariman zenity
):Ada dua mode:
berdenyut : Baris kemajuan berdenyut, itu hanya menunjukkan bahwa ada sesuatu yang sedang berjalan, tetapi tidak mengatakan apa-apa tentang kemajuan. Anda melakukan ini dengan mengatur
--pulsating
opsi.manual : Anda harus menyalurkan persentase kemajuan saat ini ke
zenity
input standar perintah untuk memperbarui bilah kemajuan.Contoh untuk ini bisa terlihat seperti itu di bawah ini. Perhatikan bahwa perintah sebelumnya dikelompokkan ke subkulit sehingga semua output dialihkan ke
zenity
dialog dan bukan hanya dari perintah terakhir:sumber
[ ###########--------------] 52%
Kode ini akan melakukannya, dan tidak memerlukan apa pun (selain bash, tentu saja). Mencetak
#
tanda-tanda, seperti yang Anda tanyakan dalam komentar Anda:Namun, jika Anda harus banyak memeriksa, ini hanya akan mengisi layar Anda dengan
#
tanda - tanda. Untuk memperbaiki masalah itu, coba kode ini:Ubah 5 di baris pertama (
lenProgressBar=5
) menjadi panjang yang Anda inginkan sebagai progress bar Anda. Diperlukan waktu lebih lama untuk mencetak#
tanda dengan progress bar yang lebih rendah daripada yang panjangnya lebih tinggi, tetapi jangan biarkan panjang progress bar melebihi ukuran layar Anda; itu tidak akan bekerja dengan baik jika Anda melakukannya. (Ini tidak akan membiarkan Anda menggunakan bilah kemajuan lebih tinggi dari jumlah item yang Anda periksa atau lebih rendah dari 1)sumber
tput cols
untuk mendeteksi lebar jendela terminal dan skala progressbar yang sesuai.Berikut pendekatan lain menggunakan kode pelarian ansi:
sumber