Bash - 1行に複数のメニューを選択するのではなく、1行に各メニューを選択する方法

Bash - 1行に複数のメニューを選択するのではなく、1行に各メニューを選択する方法

テーマメーカースクリプトには6つのオプションがあります。 1) テーマアップデートの確認 2) テーマの再インストール 3) フォントのインストール 4) 壁紙のインストール 5) ツールアップデートの確認 6) 終了

これはコードです

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

しかし、実行するとメニュー選択が混乱します。

==================
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

しかし、私が望むもの

===============
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

では、メニューはどのように修正しますか?

ベストアンサー1

このCOLUMNS変数を設定して表示幅を制限できます。たとえば、12に設定すると、例は単一の列にフォーマットされます。

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

生産する

===========================
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
#? 

これバッシュマニュアル説明列:

ユーザーselectコマンドは、選択リストを印刷するときの端末の幅を決定します。次の場合は自動的に設定されます。checkwinsizeオプションが有効になっています(参照:内蔵店舗)または対話型シェルから受信SIGWINCH

マニュアルページの機能を見ることに加えて、ソースコードを読むことも全体の内容を理解するのに役立ちます。この変数は次の目的で使用されます。select_queryコメントを含む関数

/* LISTの要素を1行に1つずつ印刷し、前に1から
   LIST_LEN。次に、PROMPTを表示し、ユーザーが数字を入力するのを待ちます。
   数値が 1 と LIST_LEN の間であれば、選択項目が返されます。ファイルの終わりに
   読んだ後は空の文字列が返されます。入力内容が空であるか無効である場合
   数字を入力してループを再実行してください。 */

そして後でselect_query機能

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

与えれば合理的な値はatoi合理的な結果を提供します(この場合は0も合理的です)。少ないatoiCOLUMNS数値以外の値に設定すると、80を超える列が返されます。値がない場合(つまりCOLUMNS=""、)bash80列が使用されます。

追加資料:

おすすめ記事