Синтаксическая ошибка рядом с неожиданным токеном «сделано» - PullRequest
2 голосов
/ 11 апреля 2011

Я пишу сценарий Unix, который будет сканировать текстовый файл, находить экземпляры определенного слова, а затем удалять соответствующую строку в другом документе.Все работало до тех пор, пока я не проверил свою последнюю попытку, и я получил:

./Present.sh: line 35: syntax error near unexpected token `done'
./Present.sh: line 35: `    done'

, и я понятия не имею, почему.Погуглив ошибку, я получил несколько ответов от unix.com, но ничего ценного (попытка советов других людей, у которых были эти проблемы, не помогла этой проблеме).Большое спасибо за помощь !!!

Мой код:

for var in bent bound bled bred brought built burned burnt bought caught clung crept dealt dug dived dreamed dreamt fed felt fought found fled flung ground hung heard held kept knelt laid led leaped leapt learned learnt left lent lighted lost made meant met misspelled misspelt mowed mown paid pled proved proven sawed sawn said sought sold sent sewed sewn shaved shaven shone shoed shod shot showed sat slept slid slung sowed sown sped spent silted spilt spun sprung stood stuck stung struck strung swept swelled swollen swung taught told thought thrived understood upheld waved woven wept wound won withheld withstood wrung 
do
    cd ~
    cd Documents/UPenn/'Senior Year'/'Spring 2011'/Thesis/Results/
    echo "$var"
    NUMLINE=0
    cat 'foradam.txt' | while IFS=$'\t' read -r word pos other; do
        if [ "$word" = '#' ] || [ "$word" = Number ] || [ "$word" = CHI ]; then
            NUMLINE=`expr $NUMLINE + 1`
            echo "error 1"
            echo "$word"
            echo "$NUMLINE"
        if [ "$word" = $var ] && [ "$pos" = VVN ];then 
            sed -i '$NUMLINE' d Brown_Adam_CIVForms.txt
            echo "error 4"
                echo "$word"
            echo "$NUMLINE"
        else
            echo "nothing on this line"
            echo "$word"
            echo "$NUMLINE"
        fi
    done
done

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

В текущем виде ваш код эквивалентен:

for var in bent bound bled bred brought built burned burnt bought caught clung \
          crept dealt dug dived dreamed dreamt fed felt fought found fled flung \
          ground hung heard held kept knelt laid led leaped leapt learned learnt \
          left lent lighted lost made meant met misspelled misspelt mowed mown \
          paid pled proved proven sawed sawn said sought sold sent sewed sewn \
          shaved shaven shone shoed shod shot showed sat slept slid slung sowed \
          sown sped spent silted spilt spun sprung stood stuck stung struck \
          strung swept swelled swollen swung taught told thought thrived \
          understood upheld waved woven wept wound won withheld withstood wrung 
do
    cd ~
    cd Documents/UPenn/'Senior Year'/'Spring 2011'/Thesis/Results/
    echo "$var"
    NUMLINE=0
    cat 'foradam.txt' | while IFS=$'\t' read -r word pos other; do
        if [ "$word" = '#' ] || [ "$word" = Number ] || [ "$word" = CHI ]; then
            NUMLINE=`expr $NUMLINE + 1`
            echo "error 1"
            echo "$word"
            echo "$NUMLINE"
            if [ "$word" = $var ] && [ "$pos" = VVN ];then 
                sed -i '$NUMLINE' d Brown_Adam_CIVForms.txt
                echo "error 4"
                echo "$word"
                echo "$NUMLINE"
            else
                echo "nothing on this line"
                echo "$word"
                echo "$NUMLINE"
            fi
        fi # This fi is missing in your code!!!
    done
done

Отсутствует 'fi', что делает 'done' неожиданным.Альтернативный диагноз состоит в том, что вложенное «if» должно быть на самом деле «elif»:

for var in bent bound bled bred brought built burned burnt bought caught clung \
          crept dealt dug dived dreamed dreamt fed felt fought found fled flung \
          ground hung heard held kept knelt laid led leaped leapt learned learnt \
          left lent lighted lost made meant met misspelled misspelt mowed mown \
          paid pled proved proven sawed sawn said sought sold sent sewed sewn \
          shaved shaven shone shoed shod shot showed sat slept slid slung sowed \
          sown sped spent silted spilt spun sprung stood stuck stung struck \
          strung swept swelled swollen swung taught told thought thrived \
          understood upheld waved woven wept wound won withheld withstood wrung 
do
    cd ~
    cd Documents/UPenn/'Senior Year'/'Spring 2011'/Thesis/Results/
    echo "$var"
    NUMLINE=0
    cat 'foradam.txt' | while IFS=$'\t' read -r word pos other; do
        if [ "$word" = '#' ] || [ "$word" = Number ] || [ "$word" = CHI ]; then
            NUMLINE=`expr $NUMLINE + 1`
            echo "error 1"
            echo "$word"
            echo "$NUMLINE"
        elif [ "$word" = $var ] && [ "$pos" = VVN ]; then 
            sed -i '$NUMLINE' d Brown_Adam_CIVForms.txt
            echo "error 4"
            echo "$word"
            echo "$NUMLINE"
        else
            echo "nothing on this line"
            echo "$word"
            echo "$NUMLINE"
        fi
    done
done
1 голос
/ 11 апреля 2011

Попробуйте поместить цикл while в подоболочку. Также один из ваших if заявлений отсутствует elif

cat 'foradam.txt' | ( while IFS=$'\t' read -r word pos other; do
    if [ "$word" = '#' ] || [ "$word" = Number ] || [ "$word" = CHI ]; then
        ...
    elif [ "$word" = $var ] && [ "$pos" = VVN ]; then 
        ...
    else
        ...
    fi
done )
0 голосов
/ 11 апреля 2011

Я посмотрел на пример for / done, и они показали его как:

#!/bin/bash
for i in $( ls ); do
    echo item: $i
done

То есть только один done в конце.У вас есть два.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...