Arrays bash内爆数组(到字符串)
我知道stackoverflow中有一些例子,但它们不能满足我的需要,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
例如: 我想得到:
#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
@KarolyHorvatheval
来保持更改后的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