Bash - написание определения функции в скрипте после первого вызова (как проблематика GOTO / перехода) - PullRequest
8 голосов
/ 24 ноября 2011

Я в основном хочу написать мне скрипт 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 ]

20 голосов
/ 24 ноября 2011

Обычная техника:

#!/bin/sh

main() {
  cmd_list
}

cat > file1 << EOF
big HEREDOC
EOF

main
4 голосов
/ 24 ноября 2011

В Bash вам придется определить всю функцию перед ее вызовом.Если вы хотите сначала написать сценарий ядра, вы можете записать операторы heredoc в другой файл сценария и вызывать его всякий раз, когда захотите, и присваивать значения, которые могут быть возвращены (могут быть) вашему сценарию ядра.

3 голосов
/ 24 ноября 2011

BASH сканирует файл линейно и выполняет операторы так, как они встречаются, так же, как когда вы находитесь в командной строке.Есть два способа сделать то, что вы хотите.Во-первых, вы можете написать генерирующий код heredoc и т. Д. В отдельном файле (скажем, helperfile.sh) и получить его с помощью . helperfile.sh.Это, наверное, лучше.Вы также можете написать вначале функцию (возможно, main), которая делает то, что вы хотите, затем код heredoc, затем в нижнем вызове main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...