#shell #awk
#оболочка #awk
Вопрос:
Возможно ли сохранить скрипт awk внутри переменной оболочки; например:
export script="'{printf($2); printf(""\n"");}'"
echo $script
'{printf($2); printf("n");}'
Скрипт функционирует должным образом, когда я вызываю его напрямую как таковой:
awk '{printf($2); printf("n");}' testFile.txt
prints proper output
Когда я пытаюсь передать скрипт как переменную оболочки, я сталкиваюсь с проблемами.
awk $script testFile.txt
awk: syntax error at source line 1
context is
>>> ' <<<
missing }
awk: bailing out at source line 1
Я получаю немного другую ошибку, когда я заключаю переменную в двойные кавычки
awk "$script" testFile.txt
awk: syntax error at source line 1
context is
>>> ' <<<
awk: bailing out at source line 1
Я все еще изучаю, как именно работают расширения оболочки, я был бы признателен за любые предложения о том, чего мне здесь не хватает.
Комментарии:
1. Почему вы храните скрипт awk в переменной среды. Это может сработать для простой
awk -f script.awk
2. Другими словами: В)
Is it possible to shoot yourself in the foot with a shotgun
? А)Sure, just hold it this way...
. Задайте новый вопрос, объясняющий, что вы пытаетесь сделать, а не как вы пытаетесь это сделать (сохраняя сегменты скрипта awk в переменных и вызывая awk для их выполнения — содрогнитесь!), И мы сможем помочь вам сделать все, что вы пытаетесь сделать правильно.
Ответ №1:
Ошибка в вашем цитировании
export script='{printf($2); printf("n");}'
awk "${script}" YourFile
Ответ №2:
Я не уверен в правильном ответе на это, но очень уродливым (и, вероятно, нестабильным в зависимости от $script
содержимого) обходным путем было бы:
echo $script | awk '{print "awk "$0" testFile.txt"}' | bash
Это просто печать содержимого $script
в awk
инструкции, которая затем выполняется bash. Я не особенно горжусь этим, но, возможно, это помогает!
Ответ №3:
Когда вы вводите
awk '{printf($2); printf("n");}' testFile.txt
awk видит только {printf($2); printf("n");}
— оболочка удаляет кавычки
(см. Удаление кавычек в руководстве по bash)
Прислушайтесь к ответу @NeronLeVelu.