如何将Bash数组的元素连接成分隔的字符串?

32 浏览
0 Comments

如何将Bash数组的元素连接成分隔的字符串?

如果我有一个Bash中的这样的数组:

FOO=( a b c )

我该怎么用逗号将其中的元素拼接起来呢?例如,产生a,b,c

admin 更改状态以发布 2023年5月24日
0
0 Comments

另一种解决方案:

#!/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

0
0 Comments

一种支持多字符定界符的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 #abc
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上的一篇文章中找到。

0