Similaire à this thread for C#, je dois diviser une chaîne contenant les arguments de la ligne de commande dans mon programme pour permettre aux utilisateurs d'exécuter facilement plusieurs commandes. Par exemple, je pourrais avoir la chaîne suivante:Fractionner une chaîne contenant des paramètres de ligne de commande en une chaîne [] en Java
-p /path -d "here's my description" --verbose other args
Compte tenu de ce qui précède, Java passerait normalement les éléments suivants pour principal:
Array[0] = -p
Array[1] = /path
Array[2] = -d
Array[3] = here's my description
Array[4] = --verbose
Array[5] = other
Array[6] = args
Je ne ai pas besoin de vous soucier de l'expansion du shell, mais il doit être assez intelligent pour gérer les guillemets simples et doubles et les échappements qui peuvent être présents dans la chaîne. Est-ce que quelqu'un connaît un moyen d'analyser la chaîne comme le shell dans ces conditions?
NOTE: Je ne pas besoin de faire l'analyse syntaxique de la ligne de commande, j'utilise déjà joptsimple pour le faire. Au contraire, je veux rendre mon programme facilement scriptable. Par exemple, je souhaite que l'utilisateur puisse placer dans un seul fichier un ensemble de commandes dont chacune serait valide sur la ligne de commande. Par exemple, ils pourraient taper la commande suivante dans un fichier:
--addUser admin --password Admin --roles administrator,editor,reviewer,auditor
--addUser editor --password Editor --roles editor
--addUser reviewer --password Reviewer --roles reviewer
--addUser auditor --password Auditor --roles auditor
Ensuite, l'utilisateur courraient mon outil d'administration comme suit:
adminTool --script /path/to/above/file
main()
vous trouverez alors l'option --script
et itérer sur les différentes lignes dans le fichier, en séparant chaque ligne dans un tableau que je déclencherais alors à une instance de joptsimple qui serait alors passée dans mon pilote d'application. Joptsimple est livré avec un analyseur qui a un parse method, mais il ne prend en charge qu'un tableau String
. De même, les constructeurs GetOpt nécessitent également un String[]
- d'où la nécessité d'un analyseur.
Ne pourriez-vous pas simplement utiliser le tableau args qui vous est donné dans main() au lieu d'essayer de l'analyser vous-même? –
J'ai mis à jour ma question pour décrire pourquoi j'ai besoin d'analyser la chaîne et comment c'est différent de l'analyse en ligne de commande. –
Je ne pense pas que ce soit différent de l'analyse en ligne de commande, voir l'addendum à ma réponse sur la façon dont j'ai abordé quelque chose de très similaire à cela dans le passé. –