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,

Другие вопросы по тегам