bash - 将包含空格的数组元素传递给 Zenity 窗口

标签 bash

我正在尝试构建一个 bash 脚本,该脚本在执行时从特定路径获取所有目录 并将它们显示在 Zenity 列表窗口中。在该窗口中,用户通过单选按钮选择目录名称并提交他的选择。

首先,这是我的 bash 脚本:

projectTypes=(~/application1/Snippets/Project\ Type/*/)
radioStates=()

for index in "${!projectTypes[@]}"; do
    if [[ "$index" = "0" ]]; then
        folderName=$(basename "${projectTypes[$index]}")
        projectTypes[$index]="$folderName"
        radioStates[$index]=TRUE
    else    
        folderName=$(basename "${projectTypes[$index]}")
        projectTypes[$index]="$folderName"
        radioStates[$index]=FALSE
    fi
done

PROJTYPE=$( zenity \
    --list --radiolist \
    --title="Project Type" --text="Please select project type:" \
    --column="Select" --column="Project Type" \
    $( \
        for index in "${!projectTypes[@]}"; do
            printf "%s %s " "${radioStates[$index]}" "${projectTypes[$index]}"
        done
    ) \
)

所以我正在尝试检索在“项目类型”文件夹中找到的所有目录 的名称。在“项目类型”文件夹中,我有以下目录:

~/application1/Snippets/Project Type/Angular 2/   
~/application1/Snippets/Project Type/PrestaShop/ 
~/application1/Snippets/Project Type/WordPress/

现在我设法将目录的名称正确地命名为 “Angular 2”“PrestaShop”“WordPress” 但我不能正确地将它们输出到 Zenity 列表窗口。

Expected Output:

SELECT | PROJECT TYPE
---------------------
(*)    | Angular 2
( )    | PrestaShop
( )    | WordPress

Current erroneous output:

SELECT | PROJECT TYPE
---------------------
(*)    | Angular
( )    | FALSE
( )    | FALSE
( )    |

Current erroneous output - Screenshot

我可以假设问题是我尝试扩展数组元素的方式,但经过数小时的研究和反复试验,我无法确定我应该如何做。

无论如何,我非常感谢任何帮助!

干杯!

最佳答案

解决问题

问题是 zenity 需要参数 zenity ... "Angular 2"... 但是读取 zenity ... "Angular""2 “。为了避免这种情况,我们可以创建一个数组来保存 zenity 的参数并以安全的方式扩展它:

# ...

argList=()
for (( i = 0; i < "${#projectTypes[@]}"; ++i )); do
    argList[2*i]="${radioStates[i]}"
    argList[2*i + 1]="${projectTypes[i]}"
done

PROJTYPE=$( zenity \
    --list --radiolist \
    --title="Project Type" --text="Please select project type:" \
    --column="Select" --column="Project Type" \
    "${argList[@]}" \
)

改进现有代码

由于您只想将第一个条目设置为 true,因此可以省略数组 radioStates 并编写

argList=()
for (( i = 0; i < "${#projectTypes[@]}"; ++i )); do
    argList[2*i]=FALSE
    argList[2*i + 1]="${projectTypes[i]}"
    argList[0]=TRUE
done

argList[0]=TRUE 位于循环内,以确保如果 projectTypes 为空,则 argList 保持为空。我们将分配多次,但作为返回保存了一个 if 语句。

关于bash - 将包含空格的数组元素传递给 Zenity 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867630/

相关文章:

python - 打印出矩阵中的值

bash - 在 bash shell 脚本中,如何将字符串转换为数字

bash - 从 bash 变量中删除空格

bash - 如何检查bash脚本中参数的长度

linux - Masscan输出仅获取ip:port并保存到文件中?

bash - 从命令行执行HBase Java应用程序时如何解决ClassNotFounException?

bash - 如何检查环境变量是否存在并获取其值?

bash 同时 [: too many arguments

linux - AWK如何将命令的输出放入变量

linux - 如何让我的一个类轮脚本根据条件打印颜色?