2017-03-17 32 views
2

我试图构建一个bash脚本,该脚本在执行时从特定路径获取所有目录并将它们显示在Zenity列表窗口中。在该窗口中,用户通过单选按钮选择目录名称并提交他的选择。将包含空白的数组元素传递给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/ 

现在我设法得到正确的目录名作为‘角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

解决问题

的问题是,需要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语句作为回报。

+0

工作很精美,而且更具可读性。谢谢! 我试图避免在同一个数组(布尔和字符串)中有两个_types_数据,所以这就是为什么我使用两个数组。在解决方案中使用多种类型的数据填充数组是否常见? –

+0

我不会说它是*标准的解决方案,但您的问题也不是我通常面对的问题。但是,所有数组条目都具有相同的类型,即* string *。 Bash支持[不同类型](https://linux.die.net/Bash-Beginners-Guide/sect_10_01.html),但没有布尔类型。无论如何,大多数人只是坚持默认的字符串类型。 – Socowi