2010-11-19 3 views
1

Je veux à l'exécution d'un script shell dans mon programme java passer un argument montré ci-dessous:arguments Passing forment programme java script bash qui appelle un autre java programa avec les arguments

Runtime.getRuntime().exec("./test.sh " + "\\\"param1\\\"\\\"param2\\\"\\\"param3\\\""); 

Et le test.sh appelleront un autre programme java passer l'argument de chaîne comme ceci:

another.jar \"param1\"\"param2\"\"param3\" 

et enfin le programme anther.jar interprétera l'argument dans ce format

another.jar "param1""param2""param3" 

Je suis un peu confondre avec ce bacause je ne peux pas traiter correctement les caractères évasions dans ce situation..kkk

J'ai essayé quelques formats de chaînes dans la première commande, mais je n'ai pas la forme correcte.

Une aide sera très bien!

Thx!

+0

Pourquoi avez-vous besoin des guillemets autour de vos arguments pour commencer? La cible .jar attend-elle des guillemets autour de ses arguments? – birryree

Répondre

3

Je pense que vous seriez mieux à l'aide exec(String[] cmdarray) au lieu de exec(String cmd). Cela est dû au fait que exec(String cmd) marque les arguments via StringTokenizer, ce qui ne prête aucune attention aux guillemets lors de la rupture des arguments de la ligne de commande.

Essayez quelque chose comme ceci:

ArrayList<String> argList = new ArrayList<String>(); 
argList.add("param1"); 
argList.add("param2"); 
argList.add("param2"); 
String[] args = argList.toArray(new String[argList.size()]); 
Runtime.getRuntime().exec("mycommand", args); 

caractères à l'intérieur des valeurs de param ne devrait pas avoir besoin de citer ou d'échapper, sauf dans la mesure peuvent nécessiter échapper littéraux de chaîne de code source Java.

+0

Je dois passer la commande avec paramètre dans une chaîne ... mais j'apprécie votre suggestion Mike! Merci! – Bera

+0

J'ai eu! "./command.sh \ "\"" + "\\\\\\\" PARAM_1 \\\\\\\ "" + \t \t "\\\\\\\" PARAM_2 \\\\\ \\ "" + \t \t "\" \ ""; – Bera

5

Utilisez ProcessBuilder. Rien de spécial à faire avec les paramètres, ils ne feront que passer.

//ProcessBuilder pb = new ProcessBuilder("test.sh", "param1", "param2", "param3"); 
ProcessBuilder pb = new ProcessBuilder("test.sh", "param1 " + "param2 " + "param3"); 
pb.start(); 

En test.sh:

java -jar program2 $1 # Or however you want to call it. 

Dans program2.java

public static void main(String[] args) 
{ 
    System.out.println(args[0]); 
} 
+0

Thans tellement Jonathon. Mais je ne suis pas en mesure de changer le chemin du programme sh ou l'autre application Java recevoir l'argument. Est-ce qu'un seul argument devrait être tranferé. Thx – Bera

+0

@Bera J'ai mis à jour la réponse - que se passe-t-il si vous l'essayez comme indiqué? Je m'attendrais à ce qu'il envoie les arguments en tant que paramètre unique. –

Questions connexes