【问题标题】:Bash multiarray and IFSBash 多阵列和 IFS
【发布时间】:2015-04-15 13:31:20
【问题描述】:

我的 bash 脚本有问题。

我会将一个字符串拆分为一个(索引命名的)数组:

字符串可以有这个值:status=online clients=5 name=Server 字符串也可以有几个命令有这样的(这是有问题的): status=online clients=5 name=Server|status=offline clients=0 name=Server_2

第一个问题:如果这个“|”,我该如何拆分,或者我应该检查一下存在吗?

第二个问题:我现在必须将这些值拆分为一个命名数组,例如来自字符串:status=online clients=5 name=Server,该数组看起来像:

[status] = [online]
[clients] = [5]
[name] = [Server]

如果分隔符“|”存在,我必须在 2 个(或更多)数组中得到结果:

$mainarray [0]
[status] = [online]
[clients] = [5]
[name] = [Server]

$mainarray [1]
[status] = [offline]
[clients] = [0]
[name] = [Server2]

例如,使用echo $mainarray[0][status] 我会“在线”。

有可能吗?

【问题讨论】:

  • bash 根本不能很好地处理嵌套数组。 (这并非不可能,但它强烈表明您应该使用不同的语言。)
  • 拥有这些拆分记录后,您需要如何处理它们?
  • @EtanReisner 评估和/或比较结果,我认为数组是最好的解决方案......
  • 你能说得更具体点吗?您是否有需要参与的外部工具?与外部数据的比较还是内部数据?如果分析只是内部的,awk 脚本可能是一个解决方案。数组是正确的想法,但 bash 可能不是。

标签: arrays bash ifs


【解决方案1】:

您可以使用伪多维关联数组。

str='status=online clients=5 name=Server|status=offline clients=0 name=Server_2'
n=0
declare -A ary

# split the string on "|"
IFS='|' read -ra sets <<< "$str"

# interate over the sets of variables to populate the array
for set in "${sets[@]}"; do
    IFS=' ' read -ra pairs <<< "$set"
    for pair in "${pairs[@]}"; do
        IFS='=' read var value <<< "$pair"
        ary["$n,$var"]=$value
    done
    ((n++))
done

# now, what do we have?
for key in "${!ary[@]}"; do 
    printf "%s => %s\n" "$key" "${ary["$key"]}"
done

输出顺序不定

0,clients => 5
1,status => offline
1,name => Server_2
0,status => online
1,clients => 0
0,name => Server

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2018-12-05
    • 2022-01-22
    相关资源
    最近更新 更多