【问题标题】:Bash - Zenity list to display fields from two arraysBash - Zenity 列表显示来自两个数组的字段
【发布时间】:2021-03-30 09:05:39
【问题描述】:

我想制作一个 zenity 列表,它从一个列表中获取一列的字段,从另一个列表中获取另一列的字段

menu=("option1" "option2" "option3")
desc=("description1" "description2" "description3")
ans=`zenity --list --column=Menu "${menu[@]}" --column=Description "${desc[@]}" --height 170`

这不起作用,因为它首先显示第一个列表中的所有值,然后显示另一个列表中的所有值:

Menu Description
option1 option2
option3 description1
description2 description3

所以我想我可能需要以交替顺序合并它们,但我不知道如何。

【问题讨论】:

    标签: bash zenity


    【解决方案1】:

    来自man zenity

      --column=STRING
             Set the column header
    

    所以--column 选项只会设置标题,不会解析您的数据。在将数据提供给 zenity 之前,您需要进行一些预处理:

    #!/usr/bin/env bash
    menu=("option1" "option2" "option3")
    desc=("description1" "description2" "description3")
    
    # this for loop will create a new array ("option1" "description1" "option2" ...)
    # there will be issues if the 2 arrays don't have the same length    
    for (( i=0; i<${#menu[*]}; ++i)); do
        data+=( "${menu[$i]}" "${desc[$i]}" )
    done
    
    ans=$(zenity --list --column=Menu --column=Description --height 170 "${data[@]}")
    

    【讨论】:

    • 如果我要更新描述数组,我是否需要重新制作数据数组以反映这一点?我应该直接更新数据数组吗?
    • @Kulpas 您可以通过 data+=( "option4" "description4" ) 在数组末尾添加新值。如果要编辑现有值,则需要知道它在数组中的位置。然后,你可以只做data[1]="newDescription1"(bash 中的数组从 0 位置开始)
    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多