将Bash字符串拆分为数组

时间:2020-01-09 10:37:27  来源:igfitidea点击:

如何从带空格的字符串创建数组。
还是在bash中将字符串拆分为数组。
我们可以有一个变量,其中的字符串用一些定界符分隔,那么如何用定界符将字符串分成数组呢。

我们将字符串分成数组的主要原因是要遍历数组中存在的元素,而这在变量中是不可能的。

包含字符串的变量的示例脚本

例如,在此脚本中,我有一个变量" myvar",其中一些字符串作为元素

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1 string2 string3"
echo "My array: $myvar"
echo "Number of elements in the array: ${#myvar[@]}"

其中:如果我要遍历myvar变量的各个元素,则不可能,因为这将被视为变量而不是数组。
我们可以通过计算myvar变量中的元素数量来验证这一点

当执行脚本时,即使有三个元素,我们也会看到" myvar"中的元素数为" 1"。

# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 1

为了克服这个问题,我们将字符串转换并拆分为array。
现在,变量可以包含字符串,整数或者某些特殊字符,因此根据要求,我们可以选择不同的方法将字符串转换为数组。
我将通过示例介绍其中的一些:

方法1:使用括号将字符串Bash拆分为数组

通常,要定义一个数组,我们使用括号"()",因此在bash中将字符串拆分为数组,我们将使用打开和关闭括号重新定义变量

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1 string2 string3"
# Redefine myvar to myarray using parenthesis
myarray=($myvar)
echo "My array: ${myarray[@]}"
echo "Number of elements in the array: ${#myarray[@]}"

接下来执行shell脚本。
我们知道数组中有3个元素

# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 3

方法2:使用读取将字符串Bash拆分为数组

我们可以使用read -a,其中每个输入字符串都被索引为数组变量。
默认定界符被视为空格,因此在此示例中,我们不需要任何其他参数:

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1 string2 string3"
# Storing as array into myarray
read -a myarray <<< $myvar
echo "My array: ${myarray[@]}"
echo "Number of elements in the array: ${#myarray[@]}"

执行脚本。
现在," myarray"包含3个元素,因此bash将字符串拆分为array成功了

# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 3

方法3:使用定界符将字符串Bash拆分为数组

我们可以结合使用read和IFS(内部字段分隔符)来定义定界符。
假设变量包含用逗号分隔的字符串,而不是上面示例中使用的空格,我们可以使用IFS提供定界符值,并使用带空格的字符串创建数组

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1,string2,string3"
# Here comma is our delimiter value
IFS="," read -a myarray <<< $myvar
echo "My array: ${myarray[@]}"
echo "Number of elements in the array: ${#myarray[@]}"

执行shell脚本,变量成功转换为数组,并且可以分别迭代字符串

# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 3

方法4:使用tr将字符串Bash拆分为数组

tr是一种多用途工具。
我们将使用此工具将逗号字符转换为空格,并在方法1的括号中进一步使用它,以从带空格的字符串中创建数组,因此我们可以将其与任何其他定界符一起使用,尽管它可能无法在所有用例中都起作用,所以我们应该根据要求进行验证

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1,string2,string3"
# Change comma (,) to whitespace and add under braces
myarray=(`echo $myvar | tr ',' ' '`)
echo "My array: ${myarray[@]}"
echo "Number of elements in the array: ${#myarray[@]}"

执行shell脚本

# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 3

在bash中将变量转换为数组的更多示例

根据要求,我们可以选择首选方法。

例如,其中:我有一个以换行符作为分隔符的变量。
所以其中我可以使用第一种方法。
这将从带有空格的字符串创建数组

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1
string2
string3"
myarray=($myvar)
echo "My array: ${myarray[@]}"
echo "Number of elements in the array: ${#myarray[@]}"

执行脚本。
我们可以使用数组中的元素数进行验证

[root@rhel-8 ~]# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 3

现在,我们可以循环访问数组中组成部分的元素

# cat /tmp/split-string.sh
#!/bin/bash
myvar="string1
string2
string3"
myarray=($myvar)
echo "My array: ${myarray[@]}"
echo "Number of elements in the array: ${#myarray[@]}"
for (( i=0; i<=${#myarray[@]}; i++ )); do
     echo "${myarray[$i]}"
done

执行脚本进行验证

# /tmp/split-string.sh
My array: string1 string2 string3
Number of elements in the array: 3
string1
string2
string3