2010-01-10 4 views
2

Я хочу встроить скрипт awk в сценарий оболочки, но у меня возникли проблемы с этим, так как я не знаю, где положить конец инструкции; и где нет.Написание сценария оболочки оболочки для awk

Вот мой сценарий

#!/bin/sh 

awk=' 

BEGIN {FS = ",?+" } 

# removes all backspaces preceded by any char except _ 
function format() { 
    gsub("[^_]\b", "") 
} 

function getOptions() { 
    getline 
    format() 

    print 
} 

{ 
    format() 

    if ($0 ~ /^SYNOPSIS$/ { 
     getOptions() 
     next    
    } 

    if ($0 /^[ \t]+--?[A-Za-z0-9]+/) { 
     print $0 
    } 
} 

END { print "\n" }' 

path='/usr/share/man/man1' 
list=$(ls $path) 

for item in $list 
do 
    echo "Command: $item" 
    zcat $path$item | nroff -man | awk "$awk" 
done > opts 

Я использую nawk кстати.

Заранее спасибо

+0

Извините, что вызвало много путаницы здесь ^^ ... прежде всего, я разместил неправильную версию скрипта, которая исправлена ​​к настоящему времени ... во-вторых, теперь скрипт работает: -) ... причина заключалась в том, что я забыл поместить $ awk в двойные кавычки, что всегда давало мне синтаксическую ошибку в первой строке скрипта ... – helpermethod

+0

Спасибо всем за ваши ответы, они обеспечили отличную проницательность ^^ – helpermethod

ответ

5

Есть несколько вещей неправильно, насколько я могу судить:

  1. Вы не закрываем строку мульти-линии назначаются на $awk. Вам нужна одна цитата на линии после END { ... }
  2. Вы, кажется, не на самом деле $awk в любом месте. Возможно, вы имели в виду вызов awk внутри цикла do.
  3. Как только вы исправите эти проблемы, awk обычно довольно прощает о точках с запятой, но любые проблемы в этом отношении не имеют никакого отношения к использованию его внутри сценария оболочки.
1

я не совсем уверен, что вы имели в виду, но если я вас правильно понимаю, ваш showOpts.awk что AWK код в начале вашего скрипта, так что вы могли бы сделать это

path='/usr/share/man/man1' 
list=$(ls $path) 

for item in $list 
do 
    echo "Command: $item" 
    zcat $path$item | nroff -man | nawk ' BEGIN {FS = ",?+" } 
# removes all backspaces preceded by any char except _ 
function format() { 
    gsub("[^_]\b", "") 
} 

function getOptions() { 
    getline 
    format() 

    print 
} 

{ 
    format() 

    if ($0 ~ /^SYNOPSIS$/ { 
     getOptions() 
     next 
    } 

    if ($0 /^[ \t]+--?[A-Za-z0-9]+/) { 
     print $0 
    } 
} 

END { print "\n" } ' 
done >> opts 

и вы, вероятно, должны использовать >> вместо>.

+3

Я бы предположил, что встраивание литералов awk в цикл, как это делает весь скрипт оболочки очень трудно читать. Присвоение его переменной сначала (например, OP пыталось сделать), а затем вызывать 'awk" $ awk "' гораздо читаем. –

+2

Поскольку перенаправление находится за пределами цикла, нет никакой причины, что он должен быть добавлением. –

3

Эти три линии:

path='/usr/share/man/man1' 

list=$(ls $path) 

for item in $list 

должны быть изменены на:

path='/usr/share/man/man1' 

for item in $path/* 

в случае существуют пробелы в именах файлов и так ls не предназначен для использования таким образом.

+0

После этого хорошего изменения '$ path $ item' должен быть просто' $ item'. А также переменные разложения должны быть указаны. Итак, 'zcat '$ item" | nroff -man | awk "$ awk" ' –

+0

Вы правы, спасибо. –

Смежные вопросы