如何在 Bash 脚本中将字符串转换为数组?

如何在 Bash 脚本中将字符串转换为数组?

我正在尝试将字符串转换为数组并循环该数组以将每个值作为参数传递给 bash 命令。执行脚本时,我收到了错误的替换消息。

text = 'xdc','cde','erd','ded','ded','kie';
OIFS=$IFS;
IFS=',';
ids=$($text);
for (i=0; i<${#ids[@]}; ++i);
do
echo "$i"
done
IFS=$OIFS

这是我编写的脚本,还包括如何将索引值作为参数传递给 for 循环内的命令。

答案1

首先,需要从字符串变量赋值周围删除文本:

text="'xdc','cde','erd','ded','ded','kie';"

然后您就可以使用 bash 命令的数组形式read

IFS=, read -a ids <<< "${text%;}"

其中${text%;}替换会删除尾随的分号。请注意,这样,IFS 不会在命令之外被修改,read因此无需保存和恢复它。


您的 C 风格 for 循环语法几乎是正确的,只是在 bash 中,循环需要双括号,例如

for ((i=0; i<${#ids[@]}; ++i)); do printf '%s\n' "${ids[i]}"; done

或者,您可以使用循环直接循环遍历数组成员for ... in

for i in "${ids[@]}"; do printf '%s\n' "$i"; done

答案2

=这将回显初始字符串中的所有项目,确保in旁边没有空格text=,并在字符串周围使用双引号。此外,您;在整个代码中使用了不必要的 s。

#!/bin/bash

text="'xdc','cde','erd','ded','ded','kie'"

IFS=',' read -ra ids <<< "$text"

for i in "${ids[@]}"
do
echo "$i"
done

这将输出

'xdc'
'cde'
'erd'
'ded'
'ded'
'kie'

相关内容