我为我的主题制作工具脚本有 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 列。
进一步阅读:
- atoi - 将字符串转换为整数
调用 atoi(str) 应等效于:
(int) strtol(str, (char **)NULL, 10)
- strtol、strtoll - 将字符串转换为长整数
如果无法进行转换,则返回 0