在Windows 7上通过Cygwin运行Bash脚本

14
我试图在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
但是当我运行它时,我会遇到错误:
line 11 :syntax error near unexpected token '$'\r'

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

这个脚本在Ubuntu服务器上运行得很好。但现在我需要在Windows机器上运行它。


1
你尝试过在文件上使用dos2unix吗?如果你用记事本或其他编辑器编辑它,并且里面有CRLF字符,那么可能会出现问题。如果我没记错的话,Cygwin只会期望LF字符作为换行符。 - scanny
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。


export SHELLOPTS 对我很有用!但偶尔我仍然会收到“无效的选项名称” - 为什么会这样? - n611x007
4
不要导出SHELLOPTS(虽然极不可能有影响,但可能会产生副作用),你可以将其定义为Windows环境变量,并将其设置为“igncr”。每个BASH实例都将继承此选项,除了设置自己的默认值。 - Tomasz Żuk
@William - 很棒!我喜欢你的解决方案。比起我的逐个转换脚本的方法,这种方式简单多了。 - EJK
2
+1 是为了解释为什么“这个注释是必需的”。 - Ti Strga
1
对我不起作用... - chtenb
显示剩余2条评论

13

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

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

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

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


1
你可以在这里下载它:https://sourceforge.net/projects/dos2unix/ -> 解压缩后,你应该会在某个地方找到一个名为dos2unix.exe的文件 -> 打开一个新的cygwin终端 -> 切换到你的脚本所在目录 -> 运行 <path_to_your_unzipped_dos2unix.exe_file> myScript.sh -> 记得用"/"替换路径中的所有"" - Boommeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接