【问题标题】:How do I create an array in bash from a command variable?如何从命令变量在 bash 中创建数组?
【发布时间】:2012-01-06 15:00:58
【问题描述】:

我试图让 SNMP 进入一个数组,变量中的数据格式为 "data1 data2""data3 data4"。本质上我只想要双引号之间的数据,不管有多少空格。

我已经用谷歌搜索了大约一个半小时,但无法弄清楚如何正确格式化数组。

这是我现在拥有的代码片段...

IN=$(snmpwalk -Oqv -v2c -c$community $ipaddr .1.3.6.1.4.1.32050.2.1.26.2)
portdesc=($(echo $IN))

这确实把它放在了一个数组中,但是当我尝试访问第一个数据集时,我得到了"data1 而不是"data1 data2"。我可以作弊,只使用两个变量,但我宁愿以正确的方式做,只为我想要的项目引用数组。 如果你能帮我解决这个问题,我会永远很开心。

echo "DEBUG0: ${portdesc[@]}"
echo "DEBUG1: ${portdesc[0]}"

DEBUG0: "Relay Output" "Expansion Power" "Expansion Tripped" "Switch Input" "Radio 1 Power" "Radio 2 Power" "Radio 3 Power" "Radio 4 Power" "Radio 1 Sync" "Radio 2 Sync" "Radio 3 Sync" "Radio 4 Sync" "Radio 1 Tripped" "Radio 2 Tripped" "Radio 3 Tripped" "Radio 4 Tripped" "SyncPipe Power" "SyncPipe Tripped" "Switch to NMEA" "2D Fix" "3D Fix" "DGPS Fix" "1PPS Active" "Radio 1 Power" "Radio 2 Power" "Radio 3 Power" "Radio 4 Power" "Radio 1 Sync" "Radio 2 Sync" "Radio 3 Sync" "Radio 4 Sync" "Radio 1 Tripped" "Radio 2 Tripped" "Radio 3 Tripped" "Radio 4 Tripped" "SyncPipe Power" "SyncPipe Tripped" "Switch to NMEA" "2D Fix" "3D Fix" "DGPS Fix" "1PPS Active" "Radio 1 Power" "Radio 2 Power" "Radio 3 Power" "Radio 4 Power" "Radio 1 Sync" "Radio 2 Sync" "Radio 3 Sync" "Radio 4 Sync" "Radio 1 Tripped" "Radio 2 Tripped" "Radio 3 Tripped" "Radio 4 Tripped" "SyncPipe Power" "SyncPipe Tripped" "Switch to NMEA" "2D Fix" "3D Fix" "DGPS Fix" "1PPS Active"

DEBUG1: "Relay

来自 CLI 的 SNMP 命令

$ snmpwalk -O qv -v2c -c<community> <ip> .1.3.6.1.4.1.32050.2.1.26.2
"Relay Output"
"Expansion Power"
"Expansion Tripped"
"Switch Input"
"Radio 1 Power"
"Radio 2 Power"
"Radio 3 Power"
"Radio 4 Power"
"Radio 1 Sync"
"Radio 2 Sync"
"Radio 3 Sync"
"Radio 4 Sync"
"Radio 1 Tripped"
"Radio 2 Tripped"

【问题讨论】:

    标签: arrays bash variables


    【解决方案1】:

    如果您给出示例输入,我会对此更有信心(我不知道 snmpwalk 的输出是什么样的)。但是据我了解,您希望数组仅在换行符处拆分文本,而不是在空格处。默认情况下,bash 在空格、制表符和换行符处拆分。要更改该行为,您可以修改 IFS 的值(Input Field Separator):

    OLDIFS="$IFS"
    IFS=$'\n'      # newlines are the only separator
    IN=($(my_command ...))
    IFS="$OLDIFS"
    

    额外的两行保存并恢复 IFS 的值,以防脚本的其他部分依赖它。

    (顺便说一句,如果您在 google 上搜索“bash 数组换行符”,您会发现一些事情可以解释这一点。)

    【讨论】:

    • 查看原始帖子了解 SNMP 输出
    • @Chris:我看到的只是你解析它的结果。我认为这与换行符分隔是一致的。如果您发布实际示例输入,它会很有帮助(假设我还没有回答您的问题)。
    • 花了我一分钟时间弄清楚您要什么。再次编辑了原始帖子,这次提供了可能有用的信息。 :)
    • @Chris:啊,酷。由于我似乎猜对了,因此输入将有助于稍后看到问题的其他人!
    【解决方案2】:

    试试这样的:

    mlm@matt-mmf-macbook.local:~
    $ a=( "data1 data2" "data3 data4" )
    
    mlm@matt-mmf-macbook.local:~
    $ echo "${a[0]}"
    data1 data2
    
    mlm@matt-mmf-macbook.local:~
    $ echo "${a[1]}"
    data3 data4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 2022-09-05
      • 1970-01-01
      • 2021-04-17
      • 2012-10-30
      相关资源
      最近更新 更多