You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PS3与select构建菜单时格式异常的问题求助

解决Bash Select菜单自动分多列的问题

我正在为公司编写一个Bash小程序,用PS3和select来显示菜单。现在遇到的问题是,菜单没有按预期显示为竖排格式:

  1. SharePoint
  2. AWS
  3. Connect Direct
  4. Proofpoint
  5. DELL
  6. Sair

而是变成了横排两列的格式:

  1. SharePoint 3. Connect Direct 5. DELL
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:03:37