gpt4 book ai didi

arrays - 如何将数组转换为逗号分隔的字符串?

转载 作者:行者123 更新时间:2023-11-29 09:36:04 25 4
gpt4 key购买 nike

我有一个数组,我正在像这样打印它:

echo "${data[*]}"

输出:
/QE-CI-RUN-71/workspace/QE-AU/57/testng-results_1.xml 
/QE-CI-RUN-71/workspace/QE-AU/57/testng-results_2.xml

我想将上述输出存储为逗号分隔值。我如何在 Bash 中实现这一目标?

数据数组是动态的,它可以有任意数量的值。

最佳答案

有几种方法可以做到这一点:

1. 直接加入 printf (来自 Charles Duffy’s comment)

printf -v joined '%s,' "${data[@]}"
echo "${joined%,}"
printf内置隐式连接数组。您可以像下面的 3a 一样交互式打印,单行阅读 printf '%s,' "${data[@]}" ,但你会留下一个尾随逗号。 (此方法甚至适用于 POSIX shell,但您必须使用 $@ 作为您的数组,因为 POSIX 无法处理其他数组类型)。
2. $IFS字段分隔符 (来自 chepner’s answer)
join_arr() {
local IFS="$1"
shift
echo "$*"
}

join_arr , "${data[@]}"
这仅在此函数的范围内重新定义了字段分隔符,因此当 $data数组会自动扩展,它使用所需的分隔符而不是全局 $IFS 的第一个值或(如果它是空的或未定义的)空间。
这可以在没有函数的情况下完成,但是保存 $IFS 有点麻烦。 : Charles Duffy notes that正在恢复 IFS="$OLD_IFS"临时重新分配后,它可以评估为 IFS="" , 但如果 $IFS以前未定义,这与 unset IFS 不同虽然可以将它们分开,但由于使用了 local,这种函数式方法要简洁得多。限制 $IFS的范围。
3a. 循环遍历其内容 (并逐步打印)
delim=""
for item in "${data[@]}"; do
printf "%s" "$delim$item"
delim=","
done
echo # add a newline
如果该循环中的其他代码涉及外部调用(甚至 sleep 0.1 ),您实际上将逐块观看此构建,这在交互式设置中很有帮助。
3b. 循环遍历其内容 (并建立一个变量)
delim=""
joined=""
for item in "${data[@]}"; do
joined="$joined$delim$item"
delim=","
done
echo "$joined"
4. 将数组保存为字符串并对其运行替换 (注意,数组必须缺少空格*)
data_string="${data[*]}"
echo "${data_string//${IFS:0:1}/,}"
* 这仅适用于 $IFS 的第一个字符(默认情况下为空格)不存在于任何数组项中。
这使用 bash 模式替换: ${parameter//pattern/string}将替换 pattern 的每个实例在 $parameterstring .在这种情况下, string${IFS:0:1} , $IFS 的子串从开头开始并在一个字符后结束。
Z Shell ( zsh ) 可以在一个嵌套参数扩展中做到这一点:
echo "${${data[@]}//${IFS:0:1}/,}"
(尽管 Z Shell 也可以通过其专用的 join 标志为 echo "${(j:,:)data}" 作为 noted by @DavidBaynard 在此答案下方的评论中更优雅地做到这一点。)

关于arrays - 如何将数组转换为逗号分隔的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53839253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com