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

bash手册描述列:

使用者select命令确定打印选择列表时的终端宽度。自动设置,如果checkwinsize选项已启用(请参阅内置商店),或者在交互式 shell 中收到SIGWINCH

除了查看手册页中的功能之外,阅读源代码也有助于了解完整的故事。该变量用于select_query函数,带有注释

/* 打印 LIST 的元素,每行一个,前面是从 1 到
   LIST_LEN。然后显示 PROMPT 并等待用户输入号码。
   如果数字介于 1 和 LIST_LEN 之间,则返回该选择。如果文件结束
   读取后,返回空字符串。如果输入空行或无效
   输入数字,再次执行循环。 */

以及后来,在select_query功能

  t = get_string_value ("列");
  COLS = (t && *t) ?阿托伊(t):80;

如果你给一个合理的值,atoi给出合理的结果(在这种情况下甚至为零也是合理的,因为这是较少的atoi超过 80 列,如果设置COLUMNS为非数字值,则会返回)。如果没有值(即COLUMNS=""),bash则使用 80 列。

进一步阅读:

相关内容