ошибка выдачи awk wk: cmd. строка: 1: блоки BEGIN должны иметь часть действия

Я написал этот тестовый скрипт:

#!/bin/bash

build_message='build'

# On first run, the supplied settings block is appended to the supplied config
# file surrounded by comments ("# build START" and "# build END").
# On subsequent runs, the lines in between the two comments will be replaced
# by the provided settings block.
config-insert () {
    settings="$1"
    file="$2"
    awk='BEGIN { p = 1; o = 1; }
        $0 ~ "^# " m " START" { p = 0; if (o) output(); o = 0; }
        $0 ~ "^# " m " END"{ p = 1; next }
        END { if (o) output(o); }
        { if (p) print $0; }
        function output() { print "# " m " START\n" s "\n# " m " END"; }'
    awk -v m="$build_message" -v s="$settings" $awk $file > $file
}

config-insert "setting block" testfile

Когда я запускаю его, я получаю странную ошибку:

авк: команд. строка: 1: блоки BEGIN должны иметь часть действия


person mattalxndr    schedule 20.04.2014    source источник
comment
Есть какие-то особые причины, по которым вы хотите написать awk вот так? awk не bash и не соответствует расширениям, которые вы ожидаете в bash. Также обратите внимание, что вы перенаправляете вывод файла в тот же файл.   -  person jaypal singh    schedule 20.04.2014
comment
Как что? Как бы вы это написали?   -  person mattalxndr    schedule 21.04.2014
comment
Я не могу писать код, глядя на код. Если вы можете указать некоторые примеры входных данных и ожидаемый результат, возможно, я смогу.   -  person jaypal singh    schedule 21.04.2014
comment
@JS웃 Я не прошу вас переписывать код. Мой вопрос: когда вы сказали «Есть какие-то особые причины, по которым вы хотите написать awk таким образом?», Какой аспект того, как я написал awk, вы имеете в виду?   -  person mattalxndr    schedule 21.04.2014
comment
Я имел в виду присвоение синтаксиса awk переменной с именем awk, а затем вызов этой переменной внутри awk.   -  person jaypal singh    schedule 21.04.2014
comment
@JS웃 Какая реальная разница между этим и чем-то вроде awk "awkscript" file?   -  person mattalxndr    schedule 21.04.2014


Ответы (2)


Поместите $awk в кавычки:

awk -v m="$build_message" -v s="$settings" "$awk" "$file"
person Roland Jansen    schedule 20.04.2014
comment
Не в одинарных кавычках, пожалуйста. - person devnull; 20.04.2014
comment
Двойные кавычки создают один параметр со всем значением $awk. Одинарные кавычки образуют одну строку, значение которой буквально равно $awk. Без кавычек последовательность параметров для каждого слова в значении $awk. - person poolie; 21.04.2014

Оболочка ест ваши цитаты. Обычно, когда я сталкиваюсь с такими проблемами со сценариями awk/bash/sed, я прибегаю к временному файлу.

    ...
    tempfile=$(mktemp)
    echo ${awk} >${tempfile}       
    awk ...  -f ${tempfile} ...
    rm ${tempfile}

В зависимости от желаемой степени безопасности вы можете использовать mktemp для создания каталога, а не файла.

person dennis    schedule 20.04.2014