Saya membuat skrip bash sederhana dan saya ingin membuat menu pilih di dalamnya, seperti ini:
$./script
echo "Choose your option:"
1) Option 1
2) Option 2
3) Option 3
4) Quit
Dan sesuai pilihan pengguna, saya ingin berbagai tindakan dijalankan. Saya noob scripting bash shell, saya telah mencari di web untuk beberapa jawaban, tetapi tidak ada yang benar-benar konkret.
bash
command-line
scripts
Daniel Rodrigues
sumber
sumber
seq 10 | fzf
. Kekurangannya adalah bahwa fzf tidak diinstal secara default. Anda dapat menemukan fzf di sini: github.com/junegunn/fzfJawaban:
Tambahkan
break
pernyataan di mana pun Anda membutuhkanselect
loop untuk keluar. Jika abreak
tidak dilakukan,select
statemen akan berulang dan menu ditampilkan kembali.Dalam opsi ketiga, saya menyertakan variabel yang ditetapkan oleh
select
pernyataan untuk menunjukkan bahwa Anda memiliki akses ke nilai-nilai itu. Jika Anda memilihnya, itu akan menampilkan:Anda bisa melihat yang
$REPLY
berisi string yang Anda masukkan saat diminta. Ini digunakan sebagai indeks ke dalam array${options[@]}
seolah-olah array berdasarkan 1. Variabel$opt
berisi string dari indeks itu dalam array.Perhatikan bahwa pilihannya bisa berupa daftar sederhana langsung dalam
select
pernyataan seperti ini:tetapi Anda tidak dapat menempatkan daftar seperti itu dalam variabel skalar karena spasi di salah satu pilihan.
Anda juga dapat menggunakan penggumpalan file jika Anda memilih di antara file-file:
sumber
break
yang keluar dariselect
loop. Anda dapat menambahkan dibreak
mana saja Anda membutuhkannya. The Bash pengguna negara "Perintah-perintah yang dieksekusi setelah setiap seleksi sampai perintah istirahat dijalankan, di mana titik pilih perintah selesai."./test.sh: line 9: syntax error near unexpected token
"Opsi 1" './test.sh: baris 9: `" Opsi 1 ")'`PS3
adalah prompt untukselect
perintah. Ini digunakan secara otomatis dan tidak perlu direferensikan secara eksplisit.PS3
danselect
dokumentasi.$options
dalamcase
pernyataan bukan nilai-nilai). Saya pikir menggunakan nilai-nilai yang lebih baik mendokumentasikan fungsi bagiancase
pernyataan itu.Bukan jawaban yang baru per se , tetapi karena tidak ada jawaban yang diterima belum, berikut adalah beberapa coding tips dan trik, untuk kedua pilih dan zenity:
Layak disebut:
Keduanya akan berulang hingga pengguna secara eksplisit memilih Berhenti (atau Batal untuk zenity). Ini adalah pendekatan yang baik untuk menu skrip interaktif: setelah pilihan dipilih dan tindakan dilakukan, menu disajikan lagi untuk pilihan lain. Jika pilihan hanya dimaksudkan satu kali saja, gunakan saja
break
setelahnyaesac
(pendekatan zenity dapat dikurangi lebih lanjut juga)Keduanya
case
berbasis indeks, bukan berbasis nilai. Saya pikir ini lebih mudah untuk kode dan pemeliharaanArray juga digunakan untuk
zenity
pendekatan.Opsi "Berhenti" tidak termasuk di antara opsi awal dan asli. Ini "ditambahkan" saat dibutuhkan, sehingga array Anda tetap bersih. Lagipula, "Berhenti" tidak diperlukan untuk zenity, pengguna cukup mengklik "Batal" (atau tutup jendela) untuk keluar. Perhatikan bagaimana keduanya menggunakan array opsi yang sama dan tidak tersentuh.
PS3
danREPLY
vars tidak dapat diganti namanya.select
hardcoded untuk menggunakan itu. Semua variabel lain dalam skrip (opt, opsi, prompt, judul) dapat memiliki nama apa pun yang Anda inginkan, asalkan Anda melakukan penyesuaiansumber
case
struktur untukselect
versi yang Anda gunakan untukzenity
versi:case "$opt" in . . . "${options[0]}" ) . . .
(bukan$REPLY
dan indeks1
,2
dan3
).$REPLY
, indeks dan nilai.Menggunakan
dialog
, perintahnya akan terlihat seperti ini:Menempatkannya dalam skrip:
sumber
TERMINAL=$(tty)
di bagian atas naskah saya dan kemudian diCHOICE
definisi variabel saya berubah2>&1 >/dev/tty
untuk2>&1 >$TERMINAL
menghindari masalah pengalihan jika skrip dijalankan dalam konteks terminal yang berbeda.--backtitle
parameter?Anda dapat menggunakan skrip sederhana ini untuk membuat opsi
sumber
Saya punya satu opsi lagi yang merupakan campuran dari jawaban-jawaban ini, tetapi yang membuatnya menyenangkan adalah Anda hanya perlu menekan satu tombol dan kemudian skrip berlanjut berkat
-n
opsi baca. Dalam contoh ini, kami diminta untuk mematikan, reboot, atau cukup keluar dari skrip menggunakanANS
sebagai variabel kami dan pengguna hanya perlu menekan E, R, atau S. Saya juga mengatur default untuk keluar sehingga jika masuk ditekan maka skrip akan keluar.sumber
Karena ini ditargetkan pada Ubuntu, Anda harus menggunakan backend debconf apa pun yang dikonfigurasi untuk digunakan. Anda dapat menemukan backend debconf dengan:
Jika dikatakan "dialog" maka kemungkinan menggunakan
whiptail
ataudialog
. Di Lucid ituwhiptail
.Jika gagal, gunakan bash "select" seperti yang dijelaskan oleh Dennis Williamson.
sumber
sumber
$
ada dari$opt
variabel dalamwhile
pernyataan. Theif
pernyataan berlebihan. Lekukan yang tidak konsisten. Menggunakanmenu
di beberapa tempat di mana seharusnya 'show_menu.
show_menu` dapat diletakkan di atas loop daripada diulang di masing-masingcase
. Lekukan yang tidak konsisten. Mencampur penggunaan kurung kotak tunggal dan yang dua kali lipat. Menggunakan urutan ANSI yang dikodekan keras alih-alihtput
. Penggunaan nama all-caps var tidak disarankan.FGRED
harus dipanggilbgred
. Gunakan backticks sebagai ganti$()
. Definisi fungsi harus konsisten dan tidak menggunakan ...\n
tidak akan pernah dieksekusi. Mungkin lebih.Saya telah menggunakan Zenity, yang sepertinya selalu ada di Ubuntu, berfungsi dengan sangat baik dan memiliki banyak kemampuan. Ini adalah sketsa dari menu yang memungkinkan:
sumber
Bash menu mewah
Cobalah dulu, lalu kunjungi halaman saya untuk deskripsi terperinci ... Tidak perlu perpustakaan atau program eksternal seperti dialog atau zenity ...
sumber
Sudah ada pertanyaan yang sama di serverfault yang dijawab. Solusi di sana menggunakan whiptail .
sumber
Dengan asumsi Anda ingin menggunakan menu skrip shell biasa (tidak ada UI mewah), periksa contoh menu dari http://www.tldp.org/LDP/abs/html/testbranch.html .
sumber