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
输出通过管道传输到hexdump
或xxd
会得到什么?
对不起,Etan,但我该如何测试这些输出
嗯?我要你告诉我们,如果你这样做,你会得到什么。这样我们就可以看到 shell 在将输出拆分到数组时看到的内容。或者你的意思是如何做到这一点? dbus-send ... | xxd
我刚刚编辑了主帖。这就是将数据存储到数组中的方式。这不是正常行为..
如果您的IFS
设置为.
,这是正常的。
【参考方案1】:
您已修改 IFS
,因此 shell 在 .
而不是空格上拆分。
不要那样做。
read
的特殊之处在于它可以直接为IFS
取一个“本地”值。
所以不是
IFS=.
while read ....; do
...
done
修改IFS
为你可以做的整个shell
while IFS=. read ....; do
...
done
并且只修改IFS
为read
内置。
【讨论】:
感谢伊坦。您的解决方案工作正常。我也可以使用 IFS=$' \t\n' 来恢复默认的 IFS。 你可以,你也可以在替换之前保存IFS
,然后恢复 那个 值,但最好不要一开始就在全局范围内搞乱它。
以上是关于Bash 将 dbus 输出存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章