Bash数组元素加单引号空格拼接,适配空数组及Maven exec传参
Bash数组转指定格式字符串(适配空数组)
需求回顾
需要将可能为空的Bash数组转换为以下格式的字符串:
- 每个元素用单引号包裹
- 元素间用单个空格分隔
- 空数组时结果为空字符串
示例:
- 空数组
()→"" - 单元素数组
("test")→"'test'" - 含空格元素数组
("foo bar")→"'foo bar'" - 多元素数组
("test" "foo bar")→"'test' 'foo bar'"
最优解决方案
无需if分支判断,直接用printf和Bash参数扩展即可实现:
array=("test" "foo bar") # 生成带单引号的元素字符串,空数组时无输出 result=$(printf "'%s' " "${array[@]}") # 移除末尾多余空格(空数组时无影响) result=${result% } # 传递给Maven exec:java mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="$result"
原理说明
printf "'%s' " "${array[@]}":- 遍历数组的每个元素,将其用
'包裹后追加一个空格。 - 当数组为空时,该命令不会产生任何输出,
result直接为空字符串。
- 遍历数组的每个元素,将其用
${result% }:- 使用Bash的参数扩展语法,移除字符串末尾的空格。
- 数组非空时,会去掉
printf额外添加的最后一个空格;数组为空时,此操作不改变结果。
场景验证
- 空数组:
array=()→result为空字符串,对应Maven命令:mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="" - 单元素数组:
array=("test")→result为'test',对应命令:mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="'test'" - 含空格元素数组:
array=("foo bar")→result为'foo bar',符合要求。 - 多元素数组:
array=("test" "foo bar")→result为'test' 'foo bar',正确匹配需求。
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

