13

Windows7のcygwinで以下のbashスクリプトを実行しようとしています

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++ ))

スクリプトはubuntuサーバーで正常に動作します。しかし、私は今それをWindowsマシンで実行する必要があります。

4

2 に答える 2

43

すべてのスクリプトを修正できない場合は、CRを無視するオプションを設定することで、CygwinのEOL動作を変更できるはずです。

set -o igncr

これを.bash_profileに追加すると、ログイン時にデフォルトでグローバルに設定されます。

export SHELLOPTS
set -o igncr

この行を#!の直後に置くことで、スクリプトごとにこれを内部的に行うこともできます。ライン:

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

オプションが有効になる前に読み取られるその行のCRを無視するには、コメントが必要です。

于 2013-01-30T15:32:06.937 に答える
13

Cygwinの最新バージョンは、Unix形式のファイルのみをサポートしているようです(つまり、DOS /Windowsの改行ではなく改行の場合は\n)。

これを修正するには、/ bin / dos2unix.exeユーティリティを実行し、コマンドの引数としてスクリプトを指定します。

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

これにより、Unix形式に変換され、実行できるようになります。

于 2013-01-30T07:36:29.023 に答える