running bash script in cygwin on windows 7
本问题已经有最佳答案,请猛点这里访问。
我试图在Windows 7上的cygwin中运行下面的bash脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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 |
但是当我运行它时,我得到错误:
1 2 3 4 | line 11 :syntax error near unexpected token '$' ' line 11 :'for (( i=1; i<= REPEATTIMES; i++ )) |
该脚本在ubuntu服务器上运行良好。 但我现在需要在Windows机器上运行它。
如果您无法修复所有脚本,则应该能够通过设置忽略CR的选项来修改Cygwin中的EOL行为:
1 | set -o igncr |
如果将其添加到.bash_profile中,则在登录时将默认全局设置:
1 2 | export SHELLOPTS set -o igncr |
您也可以在内部执行此操作,将此行放在#!之后! 线:
1 | (set -o igncr) 2>/dev/null && set -o igncr; # this comment is required |
您需要注释忽略该行中的CR,该行在该选项生效之前读取。
最新版本的Cygwin似乎只支持Unix格式的文件(即 n为换行符而不是DOS / Windows r n换行符)。
要解决此问题,请运行/bin/dos2unix.exe实用程序,将脚本作为命令的参数:
1 | e.g. /bin/dos2unix.exe myScript.sh |
这会将其转换为Unix格式,然后您应该能够运行它。