在 Bash 中将字符串拆分为数组
本教程解释了在 bash 中使用 read
命令、tr
命令和参数扩展将字符串拆分为数组。
在 Bash 中使用 read
命令将字符串拆分为数组
read
命令是 Linux 系统上的内置命令。
它用于将一行的内容读入变量。它还拆分分配给 shell 变量的字符串的单词。
在下面的脚本中,变量 $addrs
字符串被传递给 read
命令。IFS
设置作为字符串变量的单词边界的分隔符。
这意味着 -
在我们的例子中是单词边界。-a
选项告诉 read
命令将已拆分的单词存储到数组中,而 -r
选项告诉 read
命令按原样处理任何转义字符而不解释它们。
已拆分的单词存储在 ip_array
变量中。要访问数组中的各个元素,我们使用以下语法 ${array name[index]}
。
在下面的脚本中,ip_array
是数组名称,而 0
是表示数组中第一个元素的索引。
#!/usr/bin/env bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
IFS=',' read -ra ip_array <<< "$addrs"
printf "${ip_array[0]}\n"
输出显示数组中的第一个元素。
192.168.8.1
下面的脚本添加了一个遍历数组的 for
循环,并使用 echo
命令打印所有元素。
#!/usr/bin/env bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
IFS=',' read -r -a ip_array <<< "$addrs"
for ip in "${ip_array[@]}"
do
echo "$ip"
done
下面的输出显示了数组内的所有元素。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
在 Bash 中使用 tr
命令将字符串拆分为数组
tr
命令是 translate
的缩写形式。
它从标准输入中翻译、删除和压缩字符,并将结果写入标准输出。这是在命令行或 bash 脚本中操作文本的有用命令。
可用于去除重复字符、小写转大写、替换字符。
在下面的 bash 脚本中,echo
命令将字符串变量 $addrs
通过管道传送到 tr
命令,该命令将字符串变量用分隔符 ;
分开。一旦字符串被拆分,这些值就会分配给 ip_addrs
数组。
for
循环遍历 $ip_addrs
数组并使用 printf
命令打印出所有值。
#!/bin/bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
ip_addrs=(`echo $addrs | tr ',' ' '`)
for ip in "${ip_addrs[@]}"
do
printf "$ip\n"
done
下面的输出显示了数组内的所有元素。
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
在 Bash 中使用参数扩展将字符串拆分为数组
下面的脚本使用参数扩展来搜索和替换字符。
用于参数扩展的语法是 ${variable//search/replace}
。它在 variable
中搜索与 search
匹配的模式,并将其替换为 replace
。
在我们的例子中,脚本搜索模式 ,
并将其替换为 $addrs
字符串变量中的空格。${addrs//-/ }
周围的括号用于定义新字符串的数组,称为 ip_array
。
我们使用 for
循环遍历 ip_array
的所有元素并使用 echo
命令显示它们。
#!/bin/bash
addrs="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4"
set -f
ip_array=(${addrs//,/ })
for ip in "${!ip_array[@]}"
do
echo "[$ip] ${ip_array[ip]}"
done
下面的输出显示了数组内的所有元素。
[0] 192.168.8.1
[1] 192.168.8.2
[2] 192.168.8.3
[3] 192.168.8.4