Возможно ли передать скрипт в awk внутри переменной оболочки?

#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 в переменной среды. Это может сработать для простой print команды, но столкнется со многими проблемами для любого значимого сценария. Лучше сохранить 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.