Скриптовый язык

Комментарии

Символ решетка (#) и остаток строки после него — это комментарий.

Если скрипт начинается с комментария, то этот комментарий трактуется как справка о скрипте, и он будет показан командой help.

Литералы и переменные

Поддерживаются следующие типы литералов:

Определить переменную можно так: a = test. Получить значение переменной: $a.

Важно: Команды могут возвращать произвольный объект Java в качестве результата, поэтому переменная может быть объектом любого класса Java.

Предопределенные переменные

При выполнении скрипта следующие переменные определены автоматически:

Последовательное исполнение команд, перенаправление вывода

Чтобы последовательно выполнить несколько команд в одной строке, используйте символ точки с запятой (;):

echo a; echo b

Поддерживается перенаправление вывода одной команды на ввод другой (pipes):

1C:EDT> platform-versions | grep 8.3.22
8.3.22
true

Вывод команды можно перенаправить в переменную с помощью скобок:

1C:EDT> q = (echo abcd)
abcd
1C:EDT> $q
abcd

Вывод команды можно перенаправить в файл с помощью символа правой угловой скобки >:

1C:EDT> platform-versions > /home/test/platform-versions.txt
1C:EDT>

Замыкания

Замыкание это блок кода, который может быть сохранен в переменную или передан как аргумент в команду для исполнения позднее. Оформляется фигурными скобками:

1C:EDT> hi-func = { echo Привет, $args! }
echo Привет, $args!
1C:EDT> hi-func Имярек
Привет, Имярек!

В интерактивном режиме замыкания могут быть только однострочными. В скриптах возможны многострочные замыкания. В этом случае открывающая фигурная скобка должна быть на той же строке.

Правильно:

hi-func = {
    echo Привет, $args!
    echo Как дела?
}

Неправильно:

hi-func =
{
    echo Привет, $args!
    echo Как дела?
}

Управление ходом исполнения

Команды управления ходом исполнения получают на вход замыкания, к ним применяются правила оформления замыканий.

Правильно:

if { условие } {
    действие
}

Неправильно:

if { условие }
{
    действие
}
Ветвление
if { условие } { действие, если условие истинно } { действие, если условие ложно }

Последний блок, else, необязателен и может быть опущен.

В качестве условия может выступать результат выполнения команды, скрипта или значение переменной. Следующие значения считаются ложными:

  • null;
  • false (булево значение);
  • 0 (число);
  • 0 (строка);
  • пустая строка;
  • строка, состоящая из одних пробельных символов;
  • любая пустая коллекция.

Остальные значения считаются истинными.

Инвертировать условия можно командой not { условие }.

Циклы
while { условие } { действие, пока условие истинно }
until { условие } { действие, пока условие ложно }

Условие истинности такое же, как для ветвлений.

each $коллекция { действие }

Выполняет действие для каждого элемента коллекции. Текущий элемент доступен в переменной it, см. пример 2.

Работа с исключениями
try { основное действие } { действие в случае исключения } { завершающее действие }

# аналогично первому варианту, но более читабельно:
try { основное действие } catch { действие в случае исключения } finally { завершающее действие }

Аналог try / catch / finally в Java. Выполняется основное действие. Если выпало исключение, то выполняется действие в случае исключения. Завершающее действие выполняется всегда.

Третий блок, finally, не обязателен и может быть опущен.

Если нужно сделать try / finally (без catch), используйте следующую форму:

try { основное действие } finally { завершающее действие }

Бросить исключение:

throw строка/число/любой объект

Если выброшено исключение, оно будет доступно в переменной exception. В переменной будет хранится объект исключения, у него можно вызвать методы, например, message или printStackTrace:

1C:EDT> throw "Произошла ошибка"
edtsh: Произошла ошибка
Введите '$exception printStackTrace' для получения детальной информации об ошибке.
1C:EDT> $exception message
Произошла ошибка

Успешное выполненные команды обнуляют переменную exception. Если информация об исключении нужна позднее, сохраните его в другую переменную: handle_later = $exception.

Служебные команды

echo: вывод
1C:EDT> echo Всем привет!
Всем привет!
grep: поиск
1C:EDT> platform-versions | grep -q 8.3.24
true

Необязательные аргументы:

  • -i, --ignore-case — игнорировать регистр символов;
  • -n, --line-number — добавить к каждой строке номер строки;
  • -q, --quiet, --silent — подавить весь нормальный вывод;
  • -v, --invert-match — выбрать несовпадающие строки (инверсия).
cat: чтение файлов
cat /home/test/hello.txt

Выводит содержимое файла в консоль.

cd: текущий рабочий каталог
cd
cd /path/to/new/working/directory

Первый вариант выводит текущий рабочий каталог, относительно которого определяются все относительные пути. Второй вариант меняет текущий рабочий каталог на указанный.

env: переменные окружения
env
env PATH

Первый вариант выводит список всех переменных окружения. Второй вариант выводит значение указанной переменной окружения.

Взаимодействие с Java

Все переменные являются объектами Java определенных типов, у них можно вызывать методы и считывать свойства. Синтаксис следующий:

$<имя переменной> <имя метода или свойства> [аргументы]

Например:

1C:EDT> a = [1 2 abcd]
1
2
abcd

1C:EDT> $a size
3
1C:EDT> $a get 2
abcd
1C:EDT> 

В этом примере вы создаете список из 3 элементов. Переменная a после этого имеет тип java.util.List<Object>. Далее вы вызываете метод size() у этого объекта и получаете размер списка. После чего вы вызываете метод get(2), чтобы получить последний элемент.

Если у типа есть геттер (метод вида getSomething()), то его можно вызвать как $a something (без get). См. последний пример работы с исключениями):

$exception message

Здесь вызывается метод getMessage() у объекта исключения.