最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】cygwin下面写shell,运行出错:syntax error near unexpected token `$’do\r”

Linux crifan 12700浏览 0评论

【问题】

在cygwin下,用notepad++写了个简单的shell脚本,内容如下:

#!/bin/bash
#remove *.bak in subfolder files
echo 'remove *.bak'
sub_folders=`ls`
echo 'sub_folders='$sub_folders
for each_item in $sub_folders; do
    if [ -d $each_item ]; then
        echo $each_item
    else
        echo $each_item "is file ------"
    fi
done
exit 0

但是运行出错:

 line 6: syntax error near unexpected token `$'do\r''

【解决过程】

1.网上搜了下,参考:linux shell脚本报错:syntax error near unexpected token `

然后去notepad++中,视图->显示符号->显示所有符号,然后就看到了预料到的,所有的回车换行都是windows的CR LF:

所有的换行都是windows的CRLF

得知是Linux和windows下的回车换行符不兼容的问题。

所以,剩下的就是去将windows下面的CR LF,转换为Linux下面的LF,即可。

此处,不需要再麻烦地去用其他dos2unix等工具了,notepad++就可以帮忙搞定:

编辑->档案格式转换->转换为UNIX格式:

cpp 转换为Unix格式

即可将所有的 CR LF,转换为LF:

所有的都是linux的LF了

所以,越加发现notepad++的强大之处了。

然后再运行此shell脚本,即可正常运行了。

【总结】

linux/cygwin下面的shell脚本出现错误:

syntax error near unexpected token `$’do\r”

是由于该脚本文件是在windows环境下创建编辑的,其默认是将所有的回车变成:

CR加上 LF,而Linux/Unix中的回车只是LF,所以导致解释器不认,出现此错误。

解决办法就是,将所有的CRLF转换为LF即可。

转换的方法有多种,比如用dos2unix,或用此处的notepad++帮我们转换,都可以。

 

注:关于回车换行的故事,不了解的可以去看:

Permalink to 【详解】回车 换行 0x0D 0x0A CR LF r n的来龙去脉

转载请注明:在路上 » 【已解决】cygwin下面写shell,运行出错:syntax error near unexpected token `$’do\r”

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 非常感谢 ,解决了
    ttt8年前 (2017-04-15)回复
85 queries in 0.173 seconds, using 22.18MB memory