Arrays bash内爆数组(到字符串)

Arrays bash内爆数组(到字符串),arrays,bash,implode,Arrays,Bash,Implode,我知道stackoverflow中有一些例子,但它们不能满足我的需要, 例如: 我想得到: #output: foo bar)|(foo baz)|(bar baz 希望这有助于: 解决方案1 $ foo=('foo bar' 'foo baz' 'bar baz') $ foo=( "${foo[@]/%/)|(}" ) #appending ')|(' $ i="${#foo[@]}" #Taking array count. $ i=$(( i - 1 )) #i points to

我知道stackoverflow中有一些例子,但它们不能满足我的需要,
例如:

我想得到:

#output: foo bar)|(foo baz)|(bar baz
希望这有助于:

解决方案1

$ foo=('foo bar' 'foo baz' 'bar baz')
$ foo=( "${foo[@]/%/)|(}" ) #appending ')|('
$ i="${#foo[@]}" #Taking array count.
$ i=$(( i - 1 )) #i points to the final array element
$ foo[$i]="${foo[$i]%)|(}" # Removing ')|(' attached to the final element
$ final="${foo[*]}" # storing array as string with space separated values 
$ final="${final//\( /(}" #stripping the whitespace after '('
$ $ echo "$final" # and that is your result.
foo bar)|(foo baz)|(bar baz 
解决方案2

好吧,我想这是一个更简单的解决办法

$ foo=('foo bar' 'foo baz' 'bar baz')
$ final="$(printf "%s)|(" "${foo[@]}")"
$ final="${final%)|(}"
$ echo "$final"
foo bar)|(foo baz)|(bar baz
注意

printf“%s”)|(“${foo[@]}”我想需要一个解释,所以在这里

  • “${foo[@]}”
    将数组中的每个值作为单独的字展开
  • printf“%s”)|(“
    应用于上面的每个单词,其中
    )|(
    充当分隔符

我稍微修正了您的解决方案:

separator=")|("
foo=('foo bar' 'foo baz' 'bar baz')
IFS='' eval 'regex="${foo[*]/#/$separator}"'
regex="${regex:${#separator}}" # remove leading separator
echo "${regex}"

对于任何分隔符,我都需要更多全局解决方案,因此我使用循环:

varReturn=""

implode () { 
    local separator
    separator="$1"

    #local foo
    #foo=('foo bar' 'foo baz' 'bar baz')

    local array
    array=("${!2}")

    local newString
    newString=""
    for element in "${array[@]}"
    do
        newString="$newString$separator$element"
    done
    newString="${newString:${#separator}}"
    #echo "line $LINENO: ${newString}"
    varReturn="$newString"

    return 0
}
arr=("abc cba" 2 "tree" "z%s")
sep=")%s("
implode "$sep" arr[@]
result="$varReturn"
echo "line $LINENO: $result" #line 65: abc cba)%s(2)%s(tree)%s(z%s

另外,请检查我对解决方案2的另一个答案,它不能简单地概括为任意分隔符-如果分隔符包含
%
符号怎么办?@Leon如果分隔符中的字符在格式字符串中有特殊含义,您可以在其前面加上
%
。在这种情况下,
%
就是您要查找的。我知道w、 我的观点是,使用该解决方案需要修改分隔符,以便正确处理。@Leon:好的注意,这样的事情需要考虑在内。您不需要
eval
@KarolyHorvath
eval
来保持更改后的
IFS
变量对该命令的局部影响
varReturn=""

implode () { 
    local separator
    separator="$1"

    #local foo
    #foo=('foo bar' 'foo baz' 'bar baz')

    local array
    array=("${!2}")

    local newString
    newString=""
    for element in "${array[@]}"
    do
        newString="$newString$separator$element"
    done
    newString="${newString:${#separator}}"
    #echo "line $LINENO: ${newString}"
    varReturn="$newString"

    return 0
}
arr=("abc cba" 2 "tree" "z%s")
sep=")%s("
implode "$sep" arr[@]
result="$varReturn"
echo "line $LINENO: $result" #line 65: abc cba)%s(2)%s(tree)%s(z%s