我正在尝试使用字符串替换来组合数组。输出:
a,b,c
下面的方法可行,但是有没有办法不用管道呢?
#!/bin/bash
words=(a b c)
echo "${words[@]}" | sed 's/ /,/g'
我已经尝试过这个,但行不通。
echo "${words[@]// /,/}"
答案1
如果要输出由特定字符分隔的数组元素组成的字符串,请使用
words=(a b c)
( IFS=,; printf '%s\n' "${words[*]}" )
使用in*
代替in将从数组的所有元素的串联中创建一个字符串。元素将由 的第一个字符分隔,这就是为什么我们在进行扩展之前将其设置为逗号。@
"${words[*]}"
words
$IFS
我IFS
在子 shell 中进行设置,以避免无意中将其设置为除为调用创建逗号分隔字符串所需的单个扩展之外的任何其他操作printf
。
IFS
您可以设置然后重置它,而不是使用子 shell 进行本地设置:
words=(a b c)
IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}
首先添加一个逗号作为 的第一个字符$IFS
,保留变量的旧值作为逗号后面的字符。
参数替换${IFS#?}
将删除第一个字符(我们添加的逗号)。