2013-06-07 5 views
0

Je cours javascripts à partir de shell en utilisant le moteur de spidermonkey javascript et la plupart des choses fonctionnent au besoin. Je voudrais pouvoir passer des variables aux javascripts comme des arguments de la ligne de commande mais je n'ai pas réussi à trouver un moyen de le faire, ou même si c'est possible.passer des arguments variables à spidermonkey javascript de shell

À titre d'exemple, si j'ai un fichier javascript (de myJs.js) qui analyse le texte à partir des données stockées dans un fichier (data.dat), j'appelle actuellement le javascript avec la syntaxe normale:

js -f myJs.js 

et le javascript a lui-même les commandes pour obtenir les données de tout fichier que je veux traiter, comme ceci:

var fileData = read("data.dat"); 

cela fonctionne bien, mais si je veux réutiliser le javascript pour différents fichiers de données, je dois modifier le nom du fichier dans le javascript chaque fois que je veux l'exécuter pour de nouvelles données.

Ma question est, est-il un moyen de transmettre le nom du fichier (ou toute autre variable) au javascript de la ligne de commande et le récupérer comme argument à l'intérieur du javascript, quelque chose comme:

js -f myJs.js -- "othertData.dat" 

où le javascript serait en mesure d'accéder à la valeur « otherData.dat »:

var fileData = commandLine.argument[0]; 
// (I know commandLine is not an object and argument not a property, just illustrating what I want to do!); 

Il peut tout simplement pas possible de le faire. Je peux charger des fichiers à travers le javascript en faisant en sorte que le script lise un autre fichier contenant une liste de noms de fichiers mais en passant directement le nom du fichier depuis la ligne de commande, cela sera beaucoup plus facile. J'ai recherché intensivement des informations à ce sujet et il y a une certaine confusion car vous pouvez passer les arguments de spidermonkey lui-même à javascripts mais je veux passer des variables directement au script d'une manière analogue à passer des arguments variables à un bash scénario:

: myBashScript <myData1> <myData2> 

où les arguments variables sont récupérés dans des tableaux d'arguments numérotés:

firstArgument=$1 

Si cela ne peut être fait, une déclaration faisant autorité à cet effet pourrait être utile comme je l'ai trouvé ques similaires tions discutées sur le web sans réponse claire (la plupart discutent des arguments propres de spidermonkey plutôt que des variables).

Merci

+0

Veuillez ne pas marquer cela comme un doublon de [link] (http://stackoverflow.com/questions/11073713/how-to-pass-arguments-to-a-script-through-the-spidermonkey-command -line? rq = 1) comme, bien que je sois sûr qu'il veut faire la même chose, la question semble avoir été confondue avec les arguments spidermonkey auxquels je me réfère ici et n'a pas de réponse satisfaisante alors j'espère que cette question clarifiera ce qui est nécessaire et résoudre le problème. Merci. –

Répondre

1

Avec haut de l'arbre SpiderMonkey:

$ ./js --help 
[snip] 
Version: JavaScript-C24.0a1 
[snip] 
$ cat myscript.js 
print(uneval(arguments)); 
$ ./js -f myscript.js -- foo bar baz 
["foo", "bar", "baz"] 

Je pense que fait ce que vous voulez, oui?

+0

Ce serait génial si cela fonctionnait, mais hélas pas. Le jsc intégré de Mac supporte le passage d'argument suivant - mais spidermonkey ne fonctionne pas de cette façon. –

+0

Merci. Je viens de remarquer que ma version est JavaScript-C 1.8.5 2011-03-31, ce qui peut faire la différence, mais vos lignes lancent une erreur. Je peux maintenant lire une chaîne de paramètres passés si j'utilise un seul délimiteur (bien que ["a", "b", "c"] ne soit pas égal à: ["[a, b, c]"] et si j'essaie de eval à un tableau, il a un seul membre, au moins c'est un progrès, je vais continuer à expérimenter. –

0

J'ai finalement abandonné et utilisé une solution de contournement ... J'ai écrit un court script (réutilisable) qui agit comme un pont entre terminal et spidermonkey js. À partir du terminal, j'appelle le script shell avec une liste d'arguments que je veux donner au javascript (le premier étant le nom du fichier javascript à exécuter).donc au lieu de (l'équivalent de):

js -f myscript - arg1 arg2 arg3 

(que je suis incapable d'atteindre)

J'utilise

javascript myscript arg1 arg2 arg3 

(javascript est le nom de mon script pont). Ça y est, ça marche bien. Le script de pont lit simplement les arguments, les écrit dans un fichier temporaire au format javascript array, place le script .js dans le fichier temporaire et l'exécute.

# create jscode file a write js to declare an array to hold arguments 
echo "var args = new Array();" > jscode 

# write assignments to each array index to jscode file 
# counter initialised to -1 to allow first argument (filename) to be skipped 
i=-1 
for TOKEN in $* 
do 
if [ if $i != -1 ] 
    then 
    echo "args[$i] = \"$TOKEN\";" >> jscode 
fi 
i=$((i+1)) 
done 

# append script file (first arg is file name) to jscode file 
cat $1 >> jscode 
#run jscode using spidermonkey 
jsc -f jscode 

donc, si je veux envoyer des arguments "bonjour" "monde" à un javascript appelé greeting.js, du terminal que j'utilise:

javascript greeting.js hello world 

la température fichier codeJS créé commence maintenant:

var args = new Array(); 
arg[0] = "hello"; 
arg[1] = "world"; 
// contents of greeting.js appended here 
Questions connexes