Java:从String数组创建命令

时间:2014-03-26 15:30:31

标签: java shell cmd escaping exec

我有一个包含分离命令的String数组 - 每个参数位于不同的单元格中。

我想有一个获取字符串数组的方法,并使用它来准备一个语义上合法的完整命令(即处理特殊字符,例如<space>,大括号等)。然后,它应该将完整命令作为一个字符串

返回

这是我想要使用的一个非常简单的示例(如果我有createCommand()方法):

String[] cmdParts = {"ls", "-l", "/tmp /home"};
String cmd = createCommand(cmdParts);

在上面的示例中,我希望cmd包含字符串ls -l "/tmp /home"

是否有一种方法可以完成这项工作,或类似的东西?

4 个答案:

答案 0 :(得分:2)

您可以直接遍历阵列并轻松完成。我什么都想不出来

String createCommand(String[] cmdParts) {

  StringBuilder sb = new StringBuilder()
  for(String cmdPart : cmdParts) {
    if (sb.length() > 0) {
      sb.append(" ");
    }
    sb.append(cmdPart);
  }
  return sb.toString();
}

虽然它不会留下尾随或前导空格。

另请注意:

{"ls", "-l", "/tmp /home"}

不会导致

ls -l "/tmp /home"

您需要将转义的引号添加到最后一个String。

{"ls", "-l", "\"/tmp /home\""}

答案 1 :(得分:0)

如果这是你的意思,你可以连接字符串。并将其放在createCommand方法中,该方法将字符串数组作为输入并输出连接字符串:

public String createCommand(String[] parts)
{
   String result = "";
   for(String part : parts)
   {
      result = result + part + " "; \\concatenates the result string with the next string in your parts array.
   }

   return result; 
}

答案 2 :(得分:0)

最好是出于各种原因使用StringBuilder。编译器可能会将您的方法转换为StringBuilder,但您不想依赖它。有效Java的第51项是一个很好的参考,为什么你应该在这种情况下使用StringBuilder。

至于实际的方法,你会做这样的事情,但就像你说的那样,你将不得不在for循环中引入逻辑来处理转义特定字符等等。

public String createCommand(String[] cmdParts) {
    StringBuilder newCommand = new StringBuilder();
    for(String s : cmdParts) {
        newCommand.append(s).append(" ");
    }
    return newCommand.toString();
}

答案 3 :(得分:0)

如果你有java8,你可以使用以下代码:

public static void main(String[] args) { String[] cmdParts = {"ls", "-l", "/tmp /home"}; String cmd = String.join(" ", cmdParts); System.out.println(cmd); }

这更容易。如果你没有java8,你可以使用其他人的代码。