我在Bash中有一个可能为空的array.我需要将数组转换为单字符串,在每个元素两边放置一个单引号,并用一个空格分隔这些元素.例如:

  • ():"".
  • ("test"):"'test'".
  • ("foo bar"):"'foo bar'".
  • ("test" "foo bar"):"'test' 'foo bar'".

假设我的数组是$array,我把结果放在$result.我想将结果作为参数传递给Maven exec:java exec.args,如下所示:

array=("test" "foo bar")
result= # TODO
mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="$result"

这相当于:

mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="'test' 'foo bar'"

重要的是,请注意,如果数组为空,则等同于:

mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args=""

我本以为这个问题在20年前就会得到答案--也许已经得到了答案,但我找不到.我找到了Bash script pass arguments to maven个,没有答案.我找到了与分隔符连接相关的各种答案,但找不到任何可以用单引号引用每个元素、使用分隔符连接的方法,and如果数组为空,仍会生成空字符串.

例如,Concat array elements with comma and single quote - Bash非常接近:

array=("test" "foo bar")
joined=$(printf " '%s'" "${array[@]}")
result="${joined:1}"
mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="$result"

但是如果数组是空的,当我想要""的时候,我会得到"''".我想我可以做一个老式的if来处理特殊情况下的空array.有谁有更好的吗?

推荐答案

您可以使用@Q运算符(shell parameter expansion - @operator):

array=("test" "foo bar")
result="${array[*]@Q}"
mvn exec:java -Dexec.mainClass="org.example.Main" -Dexec.args="$result"

如果数组中可以同时出现单引号/双引号,请考虑以下内容:

array=("foo'bar" 'foo"bar')

mapfile -t array2 < <(perl -e '
    for $_ (@ARGV) {
        $q = /"/ ? "'\''" : q["];
        print "$q$_$q\n";
    }' "${array[@]}")

result="${array2[*]}"

这假设只有一种类型的引号可以出现在数组的单个项中.

Java相关问答推荐

如何在Spring Boot中创建500错误的响应正文?

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

使用Mockito进行的Junit测试失败

JavaFX如何在MeshView中修复多个立方体?

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

无法使用ApacheSpark依赖项构建JavaFX应用程序

我可以在MacOS上使用什么Java函数来在适当的设备上以适当的音量播放适当的alert 声音?

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

Javadoc在方法摘要中省略方法

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

如果按钮符合某些期望,如何修改它的文本?

无法使用Freemarker从XML中读取重复的标记值

Dijkstra搜索算法的实现

从映射列表中检索所有键

如何生成指定范围内的11位序列号?

AWS Java SDK v2.x中没有setObjectAcl方法

在一行中检索字符分隔字符串的第n个值

用于Java的Visual Studio代码完成不起作用

从 Java 17 切换回 Java 8 后出现的问题