Скриптовый язык
страница- Комментарии
- Литералы и переменные
- Предопределенные переменные
- Последовательное исполнение команд, перенаправление вывода
- Замыкания
- Управление ходом исполнения
- Служебные команды
- Взаимодействие с Java
Комментарии
Символ решетка (#) и остаток строки после него — это комментарий.
Если скрипт начинается с комментария, то этот комментарий трактуется как справка о скрипте, и он будет показан командой help.
Литералы и переменные
Поддерживаются следующие типы литералов:
- Строка:
"abcd", кавычки не обязательны; - Список:
[1 2 a b]; - Словарь:
[Jan=1 Feb=2 Mar=3]; - Замыкание:
{ echo hi $args }(подробнее).
Определить переменную можно так: a = test. Получить значение переменной: $a.
Важно: Команды могут возвращать произвольный объект Java в качестве результата, поэтому переменная может быть объектом любого класса Java.
Предопределенные переменные
При выполнении скрипта следующие переменные определены автоматически:
$0— путь к файлу исполняемого скрипта. В случае поставляемого скрипта это путь к ресурсу (см. раздел «Поставка скриптов»);$argc— количество переданных аргументов;$1, $2, ...— аргументы, переданные скрипту.
Последовательное исполнение команд, перенаправление вывода
Чтобы последовательно выполнить несколько команд в одной строке, используйте символ точки с запятой (;):
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() у объекта исключения.
На уровень выше: Интерфейс командной строки