Переменная интерпретируется неверно в awk - PullRequest
3 голосов
/ 20 августа 2010

В следующем коде я пытаюсь передать shell varibale в awk.Но когда я пытаюсь запустить его как a.sh foo_bar, выводится «foo not Объявлен», а когда я запускаю его как a.sh bar_bar, выводим «foo объявлен».В awk есть ошибка или я что-то не так делаю?

Я использую gawk-3.0.3.

#!/bin/awk

model=$1

awk ' {

      match("'$model'", /foo/)
      ismodel=substr("'$model'", RSTART, RLENGTH)
      if (  ismodel != foo ) {
        print  " foo is not declared"
      } else {
        print  " foo is declared"
      }
     }
    ' dummy

Пустой файл - это пустая строка.

Спасибо,

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Вы должны использовать передачу переменных AWK вместо сложных кавычек:

awk -v awkvar=$shellvar 'BEGIN {print awkvar}'

Ваш сценарий написан как сценарий оболочки, но у вас есть строка AWB shebang. Вы можете изменить это на #!/bin/sh.

1 голос
/ 20 августа 2010

Это не ошибка, а ошибка в вашем коде.Проблемная строка:

if (  ismodel != foo ) {

Здесь foo должно быть "foo".Прямо сейчас вы сравниваете с пустой переменной.Это дает ложь, когда у вас есть совпадение, и истину, когда у вас нет совпадения.Так что проблема не в том, как вы используете переменные оболочки.

Но, как сказали другие авторы, предпочтительным способом передачи аргументов в awk является использование переключателя -v.Это также будет работать, когда вы решите поместить свой awk-скрипт в отдельный файл, и предотвратит любые проблемы с цитированием.

Я также не уверен насчет использования вами фиктивного файла.Это только для примера?В противном случае вы должны опустить файл и поместить весь свой код в блок BEGIN {}.

0 голосов
/ 20 августа 2010

используйте параметр -v для передачи переменной из оболочки

awk -v model="$1" '{
  match(model, /foo/)
   .....
}
' dummy
...