如何将Bash数组的元素连接成分隔的字符串?
如何将Bash数组的元素连接成分隔的字符串?
如果我有一个Bash中的这样的数组:
FOO=( a b c )
我该怎么用逗号将其中的元素拼接起来呢?例如,产生a,b,c
。
admin 更改状态以发布 2023年5月24日
另一种解决方案:
#!/bin/bash foo=('foo bar' 'foo baz' 'bar baz') bar=$(printf ",%s" "${foo[@]}") bar=${bar:1} echo $bar
编辑:同样适用于多字符变量长度分隔符:
#!/bin/bash separator=")|(" # e.g. constructing regex, pray it does not contain %s foo=('foo bar' 'foo baz' 'bar baz') regex="$( printf "${separator}%s" "${foo[@]}" )" regex="${regex:${#separator}}" # remove leading separator echo "${regex}" # Prints: foo bar)|(foo baz)|(bar baz
一种支持多字符定界符的100%纯Bash函数是:\n\n
function join_by { local d=${1-} f=${2-} if shift 2; then printf %s "$f" "${@/#/$d}" fi }
\n\n例如:\n\n
join_by , a b c #a,b,c join_by ' , ' a b c #a , b , c join_by ')|(' a b c #a)|(b)|(c join_by ' %s ' a b c #a %s b %s c join_by $'\n' a b c #ab c join_by - a b c #a-b-c join_by '\' a b c #a\b\c join_by '-n' '-e' '-E' '-n' #-e-n-E-n-n join_by , # join_by , a #a
\n\n以上代码基于@gniourf_gniourf、@AdamKatz、@MattCowell和@x-yuri的想法。它适用于选项 errexit
( set -e
)和 nounset
( set -u
)。\n\n另外,一个更简单的仅支持单个字符定界符的函数是:\n\n
function join_by { local IFS="$1"; shift; echo "$*"; }
\n\n例如:\n\n
join_by , a "b c" d #a,b c,d join_by / var local tmp #var/local/tmp join_by , "${FOO[@]}" #a,b,c
\n\n此解决方案基于Pascal Pilz的原始建议。\n\n先前提出的解决方案的详细说明可以在“如何在Bash脚本中join()数组元素”,由meleu在dev.to上的一篇文章中找到。。