5. Ввод, вывод и системные команды¶
← Управляющие конструкции и функции · Оглавление · Далее: типы данных и методы →
print и println¶
print <значение> выводит значение в стандартный вывод. Перевод строки автоматически не добавляется.
println <значение> выводит значение и добавляет перевод строки.
print "Hello"
println ", world!"
read¶
read читает одну строку из стандартного ввода. Если тип не указан, возвращается String.
print "Name: "
$name = read
println "Hello, " + $name
С приведением типа:
print "Age: "
$age = read Integer
println "Next year: " + ($age + 1)
Поддерживаются String, Path, Integer, Number, Decimal, Boolean, а также Java-класс или псевдоним Java-класса.
exit¶
exit <код> завершает выполнение сценария с указанным кодом. Перед завершением выполняются активные defer.
if $failed {
exit 1
}
exec¶
exec(...) запускает системную утилиту и возвращает объект ExecuteResult.
$pattern = "hello"
$file = "file.txt"
$result = exec( grep -i $pattern $file )
if $result.code == 0 {
print $result.out
} else {
print $result.err
}
Поля ExecuteResult:
| Поле | Тип | Описание |
|---|---|---|
command |
String |
Выполненная команда в читаемом виде. |
out |
String |
Стандартный вывод команды. |
err |
String |
Стандартный поток ошибок. |
code |
Integer |
Код завершения процесса. |
Важное отличие от shell¶
exec не запускает shell и не склеивает аргументы в одну строку. Первый аргумент — имя утилиты, остальные передаются процессу как отдельные аргументы.
Это значит, что ;, &&, кавычки и пробелы внутри переменной не получают специального shell-смысла.
$unsafe-looking = "hello; rm -rf /"
$result = exec( printf "%s" $unsafe-looking )
println $result.out
Распаковка списка аргументов¶
...$list распаковывает список, iterable или массив в отдельные аргументы процесса.
$sources = ["src/Main.java", "src/Util.java"]
$result = exec( javac -d out ...$sources )
println "exit=" + $result.code
Передача stdin через |¶
Слева от | может быть String или ExecuteResult. Справа должен быть exec(...).
$result = "hello\nworld\n" | exec( grep hello )
print $result.out
Можно строить цепочки:
$archive = exec( tar -tf archive.tar )
$filtered = $archive | exec( grep README )
print $filtered.out
Если утилита не найдена или процесс не удалось запустить, интерпретатор выбрасывает исключение.
← Управляющие конструкции и функции · Оглавление · Далее: типы данных и методы →