Bash - написание определения функции в скрипте после первого вызова (как проблематика GOTO/ перехода)
Я в основном хочу написать мне bash-скрипт, где я сгенерирую пару больших файлов, используя heredoc; а затем выполните несколько команд, используя эти файлы.
Понятно, что (очевидно) файлы heredoc должны быть сгенерированы до запуска команд - однако меня раздражает то, что я должен написать код операторов 'heredoc', прежде чем писать код команды.
Поэтому я решил написать операторы heredoc в функции, но здесь все та же проблема: Глава 24. Функции говорят:
Определение функции должно предшествовать первому ее вызову. Не существует метода "объявления" функции, как, например, в C.
Действительно, это так:
$ cat > test.sh <<EOF
testo
function testo {
echo "a"
}
EOF
$ bash test.sh
test.sh: line 1: testo: command not found
Тогда я подумал, может быть, я смогу разместить несколько ярлыков и прыгать с GOTO
как в (псевдокоде):
$ cat > test.sh <<EOF
goto :FUNCLABEL
:MAIN
testo
goto :EXIT
:FUNCLABEL
function testo {
echo "a"
}
goto MAIN
:EXIT
... но оказывается, что BASH goto тоже не существует.
Моя единственная цель состоит в том, чтобы - сначала я хочу написать "ядро" файла сценария, которое состоит из пяти-шести команд; и только потом записывать операторы heredoc в файл сценария (который может содержать сотни строк); сначала наличие heredocs действительно затрудняет мне чтение кода. Есть ли способ добиться этого?
3 ответа
Обычная техника:
#! / Bin/ ш главный() { cmd_list } cat > file1 << EOF большой эредок EOF главный
В Bash вам придется определить всю функцию перед ее вызовом. Если вы хотите сначала написать сценарий ядра, вы можете записать операторы heredoc в другой файл сценария и вызывать его всякий раз, когда захотите, и присваивать значения, которые могут быть возвращены (могут быть) вашему сценарию ядра.
BASH сканирует файл линейно и выполняет операторы так, как они встречаются, точно так же, как когда вы находитесь в командной строке. Есть два способа сделать то, что вы хотите. Во-первых, вы можете написать генерирующий код heredoc и т. Д. В отдельном файле (скажем, helperfile.sh) и получить его с помощью . helperfile.sh
, Это, наверное, лучше. Вы также можете написать функцию (main
возможно) в начале то, что вы хотите, затем код heredoc, затем в нижней части вызова main
,