2012-07-07 70 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或这里的字符串。