В режиме консоли J, если я набираю ARGV, я получаю полный путь к jqt.exe. Но когда я пытаюсь передать некоторые строки в файл сценария J, я получаю «синтаксическую ошибку» или «ошибку домена». Как работает передача и извлечение или отображение аргументов?
Как работать с аргументами командной строки в J
Ответы (2)
Если вы хотите записать в файл, вы должны передать информацию, используя
'string' 1:!2 'filepath/jscriptfile'
см. https://www.jsoftware.com/help/dictionary/dx001.htm а>
если вы хотите передать аргумент глаголу, объявленному в скрипте, вам сначала нужно загрузить скрипт
load 'filepath/jscriptfile'
Затем, пока сценарий содержит команды, которые были назначены с помощью =:
, так что команда не является локальной для файла сценария, вы должны передать строку команде, которая теперь загружена.
verb 'string'
Взаимодействие со скриптом, который просто выводит свои аргументы:
$ cat args.ijs
#! /usr/bin/env j
exit echo each ARGV
$ ./args.ijs
j
./args.ijs
$ ./args.ijs 1 2 3
j
./args.ijs
1
2
3
$ ./args.ijs '1 2' 3
j
./args.ijs
1 2
3
ARGV
— это список упакованных аргументов скрипта. Он работает как любой список упакованных литералов, и если вы ошибаетесь в предметной области, это происходит из-за какого-то глагола в вашем скрипте, которому заданы аргументы, для обработки которых он не определен. Если вы получаете синтаксическую ошибку, это потому, что в вашем скрипте есть что-то с неправильным синтаксисом. Это не имеет отношения к ARGV
как таковому.
Возможно, вы ожидаете, что числовые аргументы будут числами? Аргументы всегда передаются в виде строк. Вот немного более сложный скрипт с использованием, который печатает сумму факториалов своих аргументов:
#! /usr/bin/env j
sumfact =: [: +/ [: ! x:
3 : 0''
if. (#ARGV) > 2 do.
echo sumfact > 0&". each 2}.ARGV
exit 0
else.
echo 'usage: ', (1{::ARGV), ' <n1> [<n2> ... <nn>]'
exit 1
end.
)
Используемый:
$ ./sumfact.ijs
usage: ./sumfact.ijs <n1> [<n2> ... <nn>]
$ ./sumfact.ijs 0
1
$ ./sumfact.ijs 5
120
$ ./sumfact.ijs 5 5 5
360
$ ./sumfact.ijs 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Текст после #!
не важен; Я использую /usr/bin/env j
, потому что у меня есть j
в моем пути, который является обычным bin/jconsole
установки J.