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

l0s*_*0ck 30 bash

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

192.168.1.1,UPDOWN,Line protocol on Interface GigabitEthernet1/0/13, changed state to up
Run Code Online (Sandbox Code Playgroud)

如何取出该字符串并从中生成2个变量(使用bash)?

比如我想要的

$ip=192.168.1.1 
$int=GigabitEthernet1/0/13
Run Code Online (Sandbox Code Playgroud)

小智 47

试试这个:

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]}"
Run Code Online (Sandbox Code Playgroud)

在此脚本中${myarray[0]}引用逗号分隔字符串中的第一个字段,${myarray[1]}引用逗号分隔字符串中的第二个字段,等等.


dam*_*ois 24

使用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
Run Code Online (Sandbox Code Playgroud)

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


gle*_*man 7

@damienfrancois有最好的答案.你也可以使用bash正则表达式匹配:

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

使用bash正则表达式,可以引用任何文字文本(必须是,如果有空格),但不能引用正则表达式元字符.

  • 我将在这里指出我在现在删除的冗余答案中所说的内容:在这种情况下,正则表达式可能不比字符串拆分好,但对其他问题可能有用. (4认同)