Bash 将 dbus 输出存储在数组中

Bash store dbus output in array

我想将 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 <                        
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]}

中检索它们

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

不要那样做。

read的特殊之处在于它可以直接为IFS取一个"local"值。

所以不用

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

它修改了 IFS 整个 shell 你可以做的

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

并且只为 read 内置修改 IFS