Bash 多阵列和 IFS
Bash multiarray and IFS
我的 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]
我会得到 "online"。
可以吗?
您可以使用伪多维关联数组。
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
我的 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]
我会得到 "online"。
可以吗?
您可以使用伪多维关联数组。
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