arrays - Bash 解析动态数组并将特定值存储在另一个

标签 arrays linux bash parsing

我正在发送一个 dbus-send 命令,它返回如下内容:

method return sender=:1.833 -> dest=:1.840 reply_serial=2
   array of bytes [
      00 01 02 03 04 05 
   ]
   int 1
   boolean true

“字节数组”大小是动态的,可以包含 n 个值。

我使用以下方法将 dbus-send 命令的结果存储在一个数组中:

array=($(dbus-send --session --print-repl ..readValue))

我希望能够检索包含在字节数组中的值,并能够在必要时显示其中一个或所有值,如下所示:

data read => 00 01 02 03 04 05
or 
first data read => 00

{array[10]} 始终可以访问第一个数据,我认为是否可以使用如下结构:

IFS=" " read -a array 
for element in "${array[@]:10}"
do
    ...
done

关于如何实现这一点有什么想法吗?

最佳答案

你真的应该为 dbus 使用一些库,比如 Net::DBus或类似的东西。

无论如何,对于上面的例子你可以这样写:

#fake dbus-send command
dbus-send() {
    cat <<EOF
method return sender=:1.833 -> dest=:1.840 reply_serial=2
   array of bytes [
      00 01 02 03 04 05 
   ]
   int 1
   boolean true
EOF
}

array=($(dbus-send --session --print-repl ..readValue))

data=($(echo "${array[@]}" | grep -oP 'array\s*of\s*bytes\s*\[\s*\K[^]]*(?=\])'))

echo "ALL data ==${data[@]}=="
echo "First item: ${data[0]}"
echo "All items as lines"
printf "%s\n" "${data[@]}"

data=($(echo "${array[@]}" | sed 's/.*array of bytes \[\([^]]*\)\].*/\1/'))

echo "ALL data ==${data[@]}=="
echo "First item: ${data[0]}"
echo "All items as lines"
printf "%s\n" "${data[@]}"

对于两个示例打印

ALL data ==00 01 02 03 04 05==
First item: 00
All items as lines
00
01
02
03
04
05

关于arrays - Bash 解析动态数组并将特定值存储在另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29096495/

相关文章:

bash - 在 Bash Shell 脚本中生成 1 到 10 之间的随机数

linux - 将多个作业数组的输出保存在一个文件中

c++ - 如何在数组中存储多个字符串?

C++将带有分隔符的文本文件读入结构数组

java - 如何在迭代多维数组后仅打印一次消息?

arrays - 对于多个查询,在数组中查找大于给定数字的第一个元素的最有效方法是什么?

linux - 如何在 vi 中获得 super 用户权限?

linux - 如果登录被拒绝,如何代表用户执行命令

c - waitpid() 不等待 child

bash - 如何更改特定字符序列的 bash 输出颜色