Запуск bash script в cygwin на окнах 7

Я пытаюсь запустить ниже bash script в cygwin на windows 7

REPEATTIMES="$1"

if [ $# = 0 ]; then

    echo "Usage: fetch topN repeatTimes"
    exit 1
fi

for (( i=1; i<=$REPEATTIMES; i++ ))
do
    echo "ITERATION: $i"
    echo "GENERATING"

    log=thelogs/log 

    bin/nutch generate crawl/segment -topN 10 > $log
    batchId=`sed -n 's|.*batch id: \(.*\)|\1|p' < $log`

    echo "batch id: $batchId "

    # rename log file by appending the batch id
    log2=$log$batchId
    mv $log $log2
    log=$log2

    echo "FETCHING"
    bin/nutch fetch crawl/segments/$batchId >> $log

    echo "PARSING"
    bin/nutch parse crawl/segments/$batchId >> $log


    echo "UPDATING DB"
    bin/nutch updatedb crawl/crawldb crawl/segments/$batchId >> $log

    echo "Done "

done

Но когда я запускаю его, я получаю ошибку:

line 11 :syntax error near unexpected token '$'\r'

line 11 :'for (( i=1; i<= REPEATTIMES; i++ ))

script отлично работает на сервере ubuntu. Но мне нужно запустить его сейчас на машине с Windows.

Ответ 1

Последняя версия Cygwin, по-видимому, поддерживает только файлы в формате Unix (т.е. с \n для новых строк, в отличие от новой строки DOS/Windows\r\n).

Чтобы исправить это, запустите утилиту /bin/dos 2unix.exe, предоставив script в качестве аргумента команды:

e.g. /bin/dos2unix.exe myScript.sh

Это преобразует его в формат Unix, и тогда вы сможете его запустить.

Ответ 2

Если вы не можете исправить все ваши сценарии, вы должны иметь возможность изменить поведение EOL в Cygwin, установив опцию игнорировать CR:

set -o igncr

Если вы добавите это в свой .bash_profile, он будет глобально установлен по умолчанию при входе в систему:

export SHELLOPTS
set -o igncr

Вы также можете сделать это за script внутренне, поставив эту строку сразу после #! строка:

(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required

Вам нужен комментарий, чтобы игнорировать CR в этой строке, которая читается до того, как этот параметр вступит в силу.