在Bash中将字符串拆分为多个变量[重复]
Posted
技术标签:
【中文标题】在Bash中将字符串拆分为多个变量[重复]【英文标题】:Split string into multiple variables in Bash [duplicate] 【发布时间】:2014-07-03 01:23:39 【问题描述】:我有一个在下面生成的字符串:
192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1/0/13, changed state to up
如何获取该字符串并从中生成 2 个变量(使用 bash)?
比如我想要
$ip=192.168.1.1
$int=GigabitEthernet1/0/13
【问题讨论】:
GigabitEthernet1/0/13
是如何分隔的? Interface<space>
后面是什么?
是的。无论接口后面是什么
【参考方案1】:
试试这个:
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]
指的是逗号分隔字符串中的 first 字段,$myarray[1]
指的是逗号分隔字符串中的 second 字段,等等
【讨论】:
【参考方案2】:使用 read
和自定义字段分隔符 (IFS=,
):
$ 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
确保将字符串括在引号中。
【讨论】:
如何将一个字符串拆分成一个数组变量? @Inoperable ***.com/questions/10586153/…【参考方案3】:@damienfrancois 有最好的答案。您还可以使用 bash 正则表达式匹配:
if [[ $string =~ ([^,]+).*"Interface "([^,]+) ]]; then
ip=$BASH_REMATCH[1]
int=$BASH_REMATCH[2]
fi
echo $ip; echo $int
192.168.1.1
GigabitEthernet1/0/13
使用 bash 正则表达式,可以引用任何文字文本(如果有空格,则必须引用),但不得引用正则表达式元字符。
【讨论】:
我将在这里指出我在现在已删除的冗余答案中所说的话:在这种情况下,正则表达式可能并不比字符串拆分好多少,但对其他问题很有用。以上是关于在Bash中将字符串拆分为多个变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章