在bash中将字符串拆分为多个变量

 2019-05-06 

Split string into multiple variables in Bash

本问题已经有最佳答案,请猛点这里访问。

我有一个在下面生成的字符串:

1
192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1/0/13, changed state to up

我如何才能取下这个字符串并从中生成2个变量(使用bash)?

例如,我想要

1
2
$ip=192.168.1.1
$int=GigabitEthernet1/0/13


试试这个:

1
2
3
4
5
6
mystring="192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1/0/13, changed state to up"

IFS=',' read -a myarray <<<"$mystring"

echo"IP: ${myarray[0]}"
echo"STATUS: ${myarray[3]}"

在这个脚本中,${myarray[0]}表示逗号分隔字符串中的第一个字段,${myarray[1]}表示逗号分隔字符串中的第二个字段等。


使用带有自定义字段分隔符(IFS=,read

1
2
3
4
5
$ IFS=, read ip state int change <<<"192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1013, changed state to up"
$ echo $ip
192.168.1.1
$ echo ${int##*Interface}
GigabitEthernet1013

确保将字符串括在引号中。


@达米恩弗朗索瓦有最好的答案。您还可以使用bash regex匹配:

1
2
3
4
5
if [[ $string =~ ([^,]+).*"Interface"([^,]+) ]]; then
    ip=${BASH_REMATCH[1]}
    int=${BASH_REMATCH[2]}
fi
echo $ip; echo $int
1
2
192.168.1.1
GigabitEthernet1/0/13

对于bash regex,可以引用任何文本(如果有空格,则必须是),但不能引用regex元字符。