2017-03-17 67 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