2012-07-07 95 views
0

我想用yad來顯示項目列表,然後對每個項目執行shell命令。然而,雅德似乎產生了一個分隔符,似乎不是一個簡單的空白。我需要幫助解析它的輸出。如果用戶selectes所有三個項目,這個bash腳本在Bash中正確解析yad輸出

#!/bin/bash 
items=`yad --list --separator='' --height=600 --multiple --column="Items" item1 item2 item3` 

echo $items 

IFS=' ' read -r -a ARRAY <<< $items 
for item in "${ARRAY[@]}"; do 
     echo "$item" 
done 

應該輸出

item1 item2 item3 
item1 
item2 
item3 

取而代之的是腳本只輸出:

item1 item2 item3 
item1 

我使用this trick到連日來的輸出解析爲一個陣列。它曾經與yad的前身zenity很好地合作,但它似乎與yad失敗了。

呼應$items成文本文件和讀取該文本文件與貓按預期工作:在上面的腳本

echo "$items" > tmpfile 
IFS=' ' read -r -a ADDR <<< `cat tmpfile` 

更換IFS=' ' read -r -a ADDR <<< $items產生預期的結果。

我在這裏錯過了什麼?

+1

如何將數組保存爲'items =($(yad --list --separator =''--height = 600 --multiple --column =「Items」item1 item2 item3))',then'for 「$ {items [@]}」中的項目;做 回聲「$ item」 done' – 2012-07-07 16:26:55

+0

謝謝!這工作得很好!但是你也有一個想法,爲什麼原始代碼不起作用?無可否認,我是一名bash初學者,但我仍然想明白問題所在。 – severin 2012-07-07 16:55:44

+0

您應該儘量避免更改IFS,或者如果您這樣做,儘快將其更改回來。否則會引起一些奇怪的意想不到的副作用。將它改爲空間並不像通常做的那樣冒險(將它改爲換行符),但避免它或存儲它並將其改回的好習慣仍然存在。 – jedwards 2012-07-07 16:58:23

回答

2

我認爲你會讓這個過程更加複雜。

這是另一種可行的方法。

items=`yad --list --separator='' --height=600 --multiple --column="Items" item1 item2 item3` 

echo $items 

for item in $items; do 
     echo "$item" 
done 

這是最簡單和最直接的。它分割IFS中的元素(默認情況下,這包括空格,製表符和換行符)

不需要創建數組,請使用read或這裏的字符串。