我正在尝试在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机器上运行它。
答案 0 :(得分:38)
如果您无法修复所有脚本,您应该能够通过设置忽略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。
答案 1 :(得分:12)
最新版本的Cygwin似乎只支持Unix格式的文件(例如,\ n用于换行符而不是DOS / Windows \ r \ n换行符。)
要解决此问题,请运行/bin/dos2unix.exe实用程序,将脚本作为命令的参数:
e.g. /bin/dos2unix.exe myScript.sh
这会将其转换为Unix格式,然后您应该可以运行它。