使用PS3与select构建菜单时格式异常的问题求助
解决Bash Select菜单自动分多列的问题
我正在为公司编写一个Bash小程序,用PS3和select来显示菜单。现在遇到的问题是,菜单没有按预期显示为竖排格式:
- SharePoint
- AWS
- Connect Direct
- Proofpoint
- DELL
- Sair
而是变成了横排两列的格式:
- SharePoint 3. Connect Direct 5. DELL
- AWS 4. Proofpoint 6. Sair
对应的代码如下:
function postagem(){ clear quodZip PS3="Plataforma que deseja enviar o arquivo [1-5]: " select i in 'SharePoint' 'AWS' 'Connect Direct' 'Proofpoint' 'DELL' 'Sair' do case "$i" in "SharePoint") plataforma="Share Point"; break ;; "AWS") plataforma="AWS"; break ;; "Connect Direct") plataforma="Connect Direct"; break ;; "Proofpoint") plataforma="Proofpoint"; break ;; "DELL") plataforma="DELL"; break ;; "Sair") exit; ;; *) echo '' echo "Opcao invalida, escolha novamente" ;; esac done }
Bash的select命令会根据终端宽度(由COLUMNS环境变量控制)自动调整菜单列数,当终端宽度足够时就会分成多列显示。要强制菜单竖排,只需在select执行前临时设置COLUMNS为较小值(比如1),让bash每行只显示一个选项。
修改后的代码:
function postagem(){ clear quodZip # 临时设置COLUMNS为1,强制菜单竖排 local COLUMNS=1 PS3="Plataforma que deseja enviar o arquivo [1-5]: " select i in 'SharePoint' 'AWS' 'Connect Direct' 'Proofpoint' 'DELL' 'Sair' do case "$i" in "SharePoint") plataforma="Share Point"; break ;; "AWS") plataforma="AWS"; break ;; "Connect Direct") plataforma="Connect Direct"; break ;; "Proofpoint") plataforma="Proofpoint"; break ;; "DELL") plataforma="DELL"; break ;; "Sair") exit; ;; *) echo '' echo "Opcao invalida, escolha novamente" ;; esac done }
用local声明COLUMNS可以保证这个修改仅在postagem函数内生效,不会影响脚本其他部分的终端布局。如果不需要局部生效,直接写COLUMNS=1即可。
内容的提问来源于stack exchange,提问作者Lucas Santos
相关产品推荐
相关产品推荐

