将Bash字符串拆分为数组
如何从带空格的字符串创建数组。
还是在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