需要将存储在bash变量中的IP地址分解为八位字节

bre*_*ner 6 regex variables bash sed ip-address

我有一个包含IP地址的bash变量(没有CIDR或任何东西,只有四个八位字节).

我需要将这个变量分成四个独立的八位字节,如下所示:

$ip = 1.2.3.4; 
$ip1 = 1
$ip2 = 2
# etc
Run Code Online (Sandbox Code Playgroud)

所以我可以逃脱sed期间.有一个更好的方法吗?是awk我在找什么?

Rob*_*vis 13

你可以使用bash.这是一个单行,假设您的地址在$ip:

IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"
Run Code Online (Sandbox Code Playgroud)

它的工作原理是仅为一个命令设置"内部字段分隔符",将其从通常的空白分隔符更改为句点.该read命令将尊重它.


cho*_*own 6

如果你想将每个八位字节分配给它自己的变量而不使用数组或带有换行符的单个变量(这样你可以通过for循环轻松运行它),你可以使用#%修饰符${x}这样:

[ 20:08 jon@MacBookPro ~ ]$ x=192.160.1.1 && echo $x
192.160.1.1
[ 20:08 jon@MacBookPro ~ ]$ oc1=${x%%.*} && echo $o1
192
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
160.1.1
[ 20:08 jon@MacBookPro ~ ]$ oc2={x%%.*} && echo $o2
160
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
1.1
[ 20:08 jon@MacBookPro ~ ]$ oc3=${x%%.*} && echo $o3
1
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
1
[ 20:08 jon@MacBookPro ~ ]$ oc4=${x%%.*} && echo $oc4
1

[ 20:09 jon@MacBookPro ~ ]$ echo "$oc1\.$oc2\.$oc3\.$oc4"
192\.160\.1\.1
Run Code Online (Sandbox Code Playgroud)

请参阅/ wiki/Bash:_Append_to_array_using_while-loop
以及本文中的更多内容.