Bash 将 dbus 输出存储在数组中

Posted

技术标签:

【中文标题】Bash 将 dbus 输出存储在数组中【英文标题】:Bash store dbus output in array 【发布时间】:2015-03-07 18:42:59 【问题描述】:

我想将一个 dbus 输出存储到一个数组中。

dbus-send --system --print-reply --dest="com.ac.comp" /com/ac/comp/IO com.ac.comp.Time.Get

当我执行上述命令时,我得到以下输出:

method return sender=:1.191 -> dest=:1.198 reply_serial=2
   uint16 1
   uint16 0
   uint16 0
   uint32 0

我的 bash 实现如下:

if [ -f $file ]                     
then
    IFS=".="                    
    while read enum name ID x                           
    do 
       if [ "$enum" == "IO" ] && [ "$name" == $IOname ]
       then 
       array=($(dbus-send --system --print-reply --dest="com.ac.comp" /com/ac/comp/IO com.ac.comp.IO.Get uint16:16)) 
       fi
    done < $1                       
else
    exit_error 
fi 

我无法解释为什么下面的回显命令:

echo $array[1] 
echo
echo $array[2] 
echo 
echo $array[3] 
echo 
echo $array[4] 
echo 
echo $array[5]
echo
echo $array[6]   
echo
echo $array[7]
echo 
echo $array[8]   
echo
echo $array[9]
echo
echo $array[10]  
echo
echo $array[11]
echo 
echo $array[12]  
echo
echo $array[13]

给了

:1

105 -> dest

:1

112 reply_serial

2
   uint16 1
   uint16 0
   uint16 0
   uint32 0

我想重用 uint16 和 uint32 值。但我虽然在 $array[7] $array[9] $array[11] 和 $array[13]

【问题讨论】:

如果将dbus-send 输出通过管道传输到hexdumpxxd 会得到什么? 对不起,Etan,但我该如何测试这些输出 嗯?我要你告诉我们,如果你这样做,你会得到什么。这样我们就可以看到 shell 在将输出拆分到数组时看到的内容。或者你的意思是如何做到这一点? dbus-send ... | xxd 我刚刚编辑了主帖。这就是将数据存储到数组中的方式。这不是正常行为.. 如果您的IFS 设置为.,这是正常的。 【参考方案1】:

您已修改 IFS,因此 shell 在 . 而不是空格上拆分。

不要那样做。

read 的特殊之处在于它可以直接为IFS 取一个“本地”值。

所以不是

IFS=.
while read ....; do
    ...
done

修改IFS 为你可以做的整个shell

while IFS=. read ....; do
    ...
done

并且只修改IFSread 内置。

【讨论】:

感谢伊坦。您的解决方案工作正常。我也可以使用 IFS=$' \t\n' 来恢复默认的 IFS。 你可以,你也可以在替换之前保存IFS,然后恢复 那个 值,但最好不要一开始就在全局范围内搞乱它。

以上是关于Bash 将 dbus 输出存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章

在 bash 中使用命令行工具解析变体数组

将空格分隔的字符串读入 Bash 中的数组

在 dbus-glib 服务器中传递数组

bash中的关联数组不在循环内存储值[重复]

如何将“查找”命令结果存储为 Bash 中的数组

如何在bash中连接数组?