在Windows 7上运行cygwin中的bash脚本

pet*_*ter 13 bash cygwin windows-7

我试图在Windows 7上的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
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我得到错误:

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

line 11 :'for (( i=1; i<= REPEATTIMES; i++ ))
Run Code Online (Sandbox Code Playgroud)

该脚本在ubuntu服务器上运行良好.但我现在需要在Windows机器上运行它.

Wil*_*iam 39

如果您无法修复所有脚本,则应该能够通过设置忽略CR的选项来修改Cygwin中的EOL行为:

set -o igncr
Run Code Online (Sandbox Code Playgroud)

如果将其添加到.bash_profile中,则在登录时将默认全局设置:

export SHELLOPTS
set -o igncr
Run Code Online (Sandbox Code Playgroud)

您也可以在内部执行此操作,将此行放在#!之后!线:

(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required
Run Code Online (Sandbox Code Playgroud)

您需要注释忽略该行中的CR,该行在该选项生效之前读取.

  • 您可以将SHELLOPTS定义为Windows环境变量并将其设置为"igncr",而不是导出SHELLOPTS(它具有副作用,尽管不太重要).除了设置自己的默认值之外,每个BASH实例都将继承此选项. (4认同)
  • +1用于解释为什么"此评论是必需的". (2认同)

EJK*_*EJK 12

最新版本的Cygwin似乎只支持Unix格式的文件(即\n为换行符而不是DOS/Windows\r \n换行符).

要解决此问题,请运行/bin/dos2unix.exe实用程序,将脚本作为命令的参数:

e.g. /bin/dos2unix.exe myScript.sh
Run Code Online (Sandbox Code Playgroud)

这会将其转换为Unix格式,然后您应该能够运行它.