GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Membuat Setiap Pilihan Menu Dalam 1 Baris Alih-alih Beberapa Pilihan Dalam 1 Baris?

Saya membuat skrip alat untuk tema saya memiliki 6 opsi:
1) Periksa pembaruan tema
2) Instal ulang tema
3) Instal font
4) Instal wallpaper
5 ) Periksa pembaruan alat
6) Keluar

Ini kodenya

clear
echo "==========================="
echo "Tool for theme"
echo "==========================="

function check_update {
echo "checking theme update"
}

function reinstall_theme {
echo "Reinstalling"
echo "==========================="
}

function font {
echo "Installing font"
}

function wall {
echo "Installing wallpaper"
}

function check_update_tool {
echo "Checking tool update"
}

all_done=0
while (( !all_done )); do
options=("Check theme update" "Reinstall theme" "Install font" "Install wallpaper" "Check tool update" "Quit")

echo "Choose an option: "
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac
done
done

echo "Exiting"
sleep 2

Tapi ketika saya menjalankannya, pilihan menunya kacau

==================
Tool for theme
==================
Choose an option:
1) Check theme update 2) Reinstall theme  3) Install font
4) Install Wallpaper     5) Check tool update      6) Quit

Tapi yang saya inginkan adalah

===============
Tool for theme
===============
Choose an option:
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit

Jadi bagaimana saya bisa memperbaiki menu?

Jawaban yang Diterima:

Anda dapat mengatur COLUMNS variabel untuk membatasi lebar tampilan, mis., jika Anda menyetelnya ke 12, itu akan memformat contoh Anda menjadi satu kolom:

COLUMNS=12
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac

menghasilkan

===========================
Tool for theme
===========================
Choose an option: 
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit
#? 

Manual bash menjelaskan KOLOM:

Digunakan oleh select perintah untuk menentukan lebar terminal saat mencetak daftar pilihan. Secara otomatis disetel jika checkwinsize opsi diaktifkan (lihat The Shopt Builtin), atau di shell interaktif setelah menerima SIGWINCH .

Selain melihat fitur di halaman manual, ada baiknya membaca kode sumber untuk mendapatkan cerita yang lengkap. Variabel ini digunakan dalam select_query fungsi, dengan komentar

/* Print the elements of LIST, one per line, preceded by an index from 1 to
   LIST_LEN.  Then display PROMPT and wait for the user to enter a number.
   If the number is between 1 and LIST_LEN, return that selection.  If EOF
   is read, return a null string.  If a blank line is entered, or an invalid
   number is entered, the loop is executed again. */

dan kemudian, di select_query fungsi

  t = get_string_value ("COLUMNS");
  COLS =  (t && *t) ? atoi (t) : 80;

Jika Anda memberi masuk akal nilai, atoi memberikan hasil yang masuk akal (bahkan nol dalam kasus ini akan masuk akal, karena itu kurang dari 80 kolom, dan akan dikembalikan oleh atoi jika Anda menyetel COLUMNS ke nilai nonnumerik). Jika tidak ada nilai, (yaitu COLUMNS="" ), bash menggunakan 80 kolom.

Terkait:Bash:Shift+tombol panah membuat A,B,C,D?

Bacaan lebih lanjut:

  • atoi – mengubah string menjadi integer

    Panggilan atoi(str) harus sama dengan:
    (int) strtol(str, (char **)NULL, 10)

  • strtol, strtoll – mengubah string menjadi bilangan bulat panjang

    Jika tidak ada konversi yang dapat dilakukan, 0 akan dikembalikan


Linux
  1. Bagaimana Cara Menambahkan Beberapa Baris Ke File?

  2. Bagaimana Mengurai Setiap Baris File Teks Sebagai Argumen Untuk Perintah?

  3. Cara menggemakan Baris Baru di Bash Shell Script

  1. Bagaimana saya bisa membuat grep mencetak baris di bawah dan di atas setiap baris yang cocok?

  2. Di Bash, bagaimana cara menambahkan string setelah setiap baris dalam file?

  3. Di shell Linux, bagaimana saya bisa memproses setiap baris dari string multiline?

  1. Cara mendapatkan n karakter pertama dari setiap baris dalam file data unix

  2. Cara mencetak nama grup linux pada banyak baris alih-alih keluaran satu baris

  3. Cara membuat perintah grep mengembalikan seluruh baris yang cocok