在Windows7上的cygwin中运行bash脚本

在Windows7上的cygwin中运行bash脚本,bash,windows-7,cygwin,Bash,Windows 7,Cygwin,我试图在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/nut

我试图在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
REPEATTIMES=“$1”
如果[$#=0];然后
echo“用法:获取topN重复次数”
出口1
fi
对于((i=1;i$log)
batchId=`sed-n's |。*批id:\(.*\)\1 | p'<$log`
echo“批次id:$batchId”
#通过追加批处理id重命名日志文件
log2=$log$batchId
mv$log$log2
log=$log2
回音“抓取”
bin/nutch抓取爬网/segments/$batchId>>$log
回声“解析”
bin/nutch解析爬网/segments/$batchId>>$log
回显“更新数据库”
bin/nutch updatedb crawl/crawdb crawl/segments/$batchId>>$log
回音“完成”
完成

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

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

line 11 :'for (( i=1; i<= REPEATTIMES; i++ ))
第11行:意外标记“$”附近的语法错误\r\n

第11行:'for((i=1;i最新版本的Cygwin似乎只支持Unix格式的文件(即,与DOS/Windows新行相对的\r\n新行)

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

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

这将把它转换为Unix格式,然后您应该能够运行它。

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

set -o igncr
如果将其添加到.bash_配置文件中,则在您登录时,默认情况下将对其进行全局设置:

export SHELLOPTS
set -o igncr
您也可以在每个脚本内部执行此操作,方法是将此行放在#!行之后:


您需要注释来忽略该选项生效前读取的那一行中的CR。

您在该文件上尝试过dos2unix吗?如果您使用记事本或其他工具编辑该文件,并在其中包含CRLF字符,则可能会出错。如果我记得正确,Cygwin只希望LF字符作为换行符。export SHELLOPTS成功了对我来说!但有时我仍然会得到“无效选项名”-这是为什么?您也可以将SHELLOPTS定义为Windows环境变量,并将其设置为“igncr”,而不是导出SHELLOPTS(这有副作用,尽管不太可能重要)。除了设置自己的默认值之外,每个BASH实例都将继承此选项。@William-Nice!我喜欢你的解决方案。这比我转换每个脚本的方法简单得多。+1解释为什么“需要此注释”。不适用于我…您可以在此处下载:->解压它,您现在应该在某处有一个文件dos2unix.exe->打开新的cygwin终端->将cd放入脚本->运行myScript.sh->记住将路径中的所有“\”替换为“/”
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is required