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

时间:2017-03-17 21:51:24

标签: 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
    ) \
)

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

~/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

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

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

干杯!

1 个答案:

答案 0 :(得分:1)

解决问题

问题是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位于循环内部,以确保argList为空时projectTypes保持为空。我们将分配多次,但保存了一个if语句作为回报。