Saya seorang pemula bash, tetapi saya ingin membuat skrip di mana saya ingin memungkinkan pengguna untuk memilih beberapa opsi dari daftar opsi.
Pada dasarnya yang saya inginkan adalah sesuatu yang mirip dengan contoh di bawah ini:
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done
(Bersumber dari http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss9.1 )
Namun skrip saya akan memiliki lebih banyak opsi, dan saya ingin memperbolehkan beberapa kelipatan untuk dipilih. Jadi sesuatu seperti ini:
1) Opsi 1
2) Opsi 2
3) Opsi 3
4) Opsi 4
5) Selesai
Memiliki umpan balik tentang yang telah mereka pilih juga akan sangat bagus, misalnya tanda plus di samping yang sudah mereka pilih. Misalnya jika Anda memilih "1" Saya ingin halaman dihapus dan dicetak ulang:
1) Option 1 +
2) Option 2
3) Option 3
4) Option 4
5) Done
Kemudian jika Anda memilih "3":
1) Option 1 +
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Juga, jika mereka kembali memilih (1) Saya ingin "membatalkan pilihan" opsi:
1) Option 1
2) Option 2
3) Option 3 +
4) Option 4
5) Done
Dan akhirnya ketika Selesai ditekan saya ingin daftar yang dipilih untuk ditampilkan sebelum program keluar, misalnya jika keadaan saat ini adalah:
1) Option 1
2) Option 2 +
3) Option 3 +
4) Option 4 +
5) Done
Menekan 5 seharusnya mencetak:
Option 2, Option 3, Option 4
... dan skrip berakhir.
Jadi pertanyaan saya - apakah ini mungkin dalam bash, dan jika demikian apakah ada yang bisa memberikan contoh kode?
Saran apa pun akan sangat dihargai.
Jika Anda anggap
whiptail
kompleks, ini dia kode bash-only yang melakukan persis apa yang Anda inginkan. Ini pendek (~ 20 baris), tetapi agak samar untuk pemula. Selain menunjukkan "+" untuk opsi yang dicentang, itu juga memberikan umpan balik untuk setiap tindakan pengguna ("opsi tidak valid", "opsi X dicentang" / tidak dicentang, dll).Yang mengatakan, ini dia!
Semoga Anda menikmati ... itu adalah tantangan yang cukup menyenangkan untuk membuatnya :)
sumber
while menu && read -rp "$prompt" nums && [[ "$nums" ]]; do while read num; do ... done < <(echo $nums |sed "s/ /\n/g") done
git bash
di windows!Inilah cara untuk melakukan apa yang Anda inginkan hanya menggunakan fitur Bash tanpa ketergantungan eksternal. Ini menandai pilihan saat ini dan memungkinkan Anda untuk mengubahnya.
Untuk ksh, ubah dua baris pertama dari fungsi:
dan shebang untuk
#!/bin/ksh
.sumber
options=(*)
(atau pola penggumpalan lainnya) akan memberi Anda daftar file dalam array. Tantangannya kemudian akan mendapatkan array tanda seleksi (${opts[@]}
) di-zip bersama-sama dengannya. Ini dapat dilakukan dengan satufor
loop, tetapi harus dijalankan untuk setiap melewatiwhile
loop luar . Anda mungkin ingin mempertimbangkan untuk menggunakandialog
atauwhiptail
seperti yang saya sebutkan dalam jawaban saya yang lain - meskipun ini adalah dependensi eksternal.${opts[@]}
dan menyimpan string, diteruskan sebagai argumen tambahan ke fungsi, bukan+
).Saya menulis sebuah perpustakaan bernama kuesioner , yang merupakan mini-DSL untuk membuat kuesioner baris perintah. Ini meminta pengguna untuk menjawab serangkaian pertanyaan dan mencetak jawaban ke stdout.
Itu membuat tugas Anda sangat mudah. Instal dengan
pip install questionnaire
dan buat skrip, misalnyaquestions.py
, seperti ini:Kemudian jalankan
python questions.py
. Ketika Anda selesai menjawab pertanyaan-pertanyaan yang mereka cetak untuk stdout. Ini bekerja dengan Python 2 dan 3, salah satunya hampir pasti diinstal pada sistem Anda.Ini dapat menangani kuesioner yang jauh lebih rumit juga, kalau-kalau ada yang ingin melakukan ini. Berikut ini beberapa fitur:
sumber
Saya menggunakan contoh dari MestreLion dan menyusun kode di bawah ini. Yang perlu Anda lakukan adalah memperbarui opsi dan tindakan di dua bagian pertama.
sumber
n1 SELECTION
adalah bagian penting untuk meningkatkan jumlah digit ..-n2 SELECTION
akan menerima dua digit (mis. 15),-n3
menerima tiga digit ( mis. 153), dll.Berikut adalah fungsi bash yang memungkinkan pengguna untuk memilih beberapa opsi dengan tombol panah dan Spasi, dan mengonfirmasi dengan Enter. Ini memiliki nuansa seperti menu yang bagus. Saya menulisnya dengan bantuan https://unix.stackexchange.com/a/415155 . Ini bisa disebut seperti ini:
Hasilnya disimpan sebagai array dalam variabel dengan nama yang disediakan sebagai argumen pertama. Argumen terakhir adalah opsional dan digunakan untuk membuat beberapa opsi dipilih secara default. Ini terlihat seperti ini.
sumber
Karena saya tidak menemukan alternatif BASH yang cocok untuk prompt-toolkit (python), dialoguer (rust) atau inquirer (node) saya mencobanya sendiri:
https://i.stack.imgur.com/6AyAI.png
https://asciinema.org/a/Y4hLxnN20JtAlrn3hsC6dCRn8 https://gist.github.com/blurayne/f63c5a8521c0eeab8e9afd8baa45c65e
sumber
sumber
easybashgui
.