写shell,运行出错:syntax error near unexpected token `$’do\r”

本文详细解析了在Cygwin环境下使用notepad++编写Shell脚本时遇到的syntax error near unexpected token `$’do\r错误。通过调整notepad++设置,将Windows的CR LF换行符转换为Linux的LF格式,成功解决了兼容性问题。

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

写shell,运行出错:syntax error near unexpected token `$’do\r”

 

【问题】

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

 

1

2

3

4

5

6

7

8

9

10

11

12

13

#!/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

 

但是运行出错:

 

1

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

 

【解决过程】

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

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

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

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

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

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

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

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

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

【总结】

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

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

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

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

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

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

 

分类: shell

<think> 我们正在处理一个Shell脚本错误,具体错误信息是:第5行出现'syntax error near unexpected token `do''。根据引用[3]中的例子,类似错误可能是由于循环结构(如for循环)的语法问题导致的。通常,Shell脚本中for循环的正确语法应该是: for 变量 in 列表 do 命令 done 或者在一行中:for 变量 in 列表; do 命令; done 错误可能出现在do前面缺少分号(当do和for在同一行时)或者格式不正确。 另外,引用[1]中提到脚本中出现'\r'的命令未找到错误,这通常是因为脚本文件是在Windows环境下编辑的,导致换行符是\r\n,而Linux环境下要求换行符为\n。这可能会导致解析错误,包括将\r视为命令的一部分而报错。因此,我们也需要检查脚本的换行符格式。 根据引用[3]的示例,错误信息“syntax error near unexpected token `do'”可能是由于在do之前缺少分号或换行符导致的,特别是在for循环中。 解决步骤: 1. 检查脚本第5行及其附近(比如第4行)的语法,特别是循环结构(for、while等)的书是否正确。 2. 检查脚本的换行符格式是否正确(是否为LF,而不是CRLF)。可以使用dos2unix工具转换。 3. 确保脚本中使用的命令(如mysql等)已经安装且路径正确(引用[1]中出现了mysql命令未找到的错误,但我们的错误是语法错误,所以先解决语法问题)。 具体到我们的错误,重点在第5行的do附近。 可能的错误原因及解决方案: - 如果在for循环中,do前面缺少分号(当for语句和do在同一行时),需要加分号。例如:`for i in 1 2 3; do` - 如果在while或until循环中,同样需要检查do前面的条件语句是否正确结束(通常需要分号或换行)。 - 检查是否有单词拼错误,比如将do成了doe等。 - 检查脚本中是否有多余的字符,比如不可见的回车符(\r)等。 操作建议: 1. 使用cat命令查看脚本第5行及前后几行的内容:`cat -n tt.sh | head -10`(查看前10行,重点是第5行附近) 2. 使用vi编辑器打开脚本,在命令模式下输入`:set list`,可以显示隐藏字符(如回车符^M)。如果发现^M,则需要删除(在vi中,可以用:%s/^M//g,注意^M的输入方式是Ctrl+V然后Ctrl+M)。 3. 也可以使用dos2unix命令转换整个脚本:`dos2unix tt.sh` 如果用户无法直接查看,我们可以给出修改建议。 但是,由于用户没有提供脚本内容,我们只能根据常见情况给出解决方案。 因此,我们可以这样回答: </think> 根据引用内容,出现 `syntax error near unexpected token 'do'` 错误通常源于以下原因及解决方案: ### 错误原因分析 1. **格式问题(最常见)** 脚本包含 Windows 换行符 `\r`(引用[1]),导致 Linux 系统无法识别。错误信息中的 `$'\r'` 表明存在回车符污染。 2. **循环语法错误**(引用[3][4]) - `for/while` 循环中 `do` 前缺少分号 `;` - 多行循环未正确换行 - 条件语句括号格式错误 3. **字符编码问题** 隐藏的特殊字符(如制表符、不可见 Unicode)干扰解析(引用[1][3]) ### 解决方案 #### 第一步:清除回车符(关键步骤) ```bash dos2unix tt.sh # 直接转换(推荐) # 或手动替换 sed -i 's/\r//' tt.sh ``` #### 第二步:检查第5行循环语法(引用[3][4]) ```bash # 查看第4-6行内容(含行号) sed -n '4,6p' tt.sh ``` **正确法示例:** ```bash # 单行法(需分号) for i in {1..5}; do echo $i; done # 多行法(换行无分号) for i in {1..5} do echo $i done ``` #### 第三步:验证脚本基础语法 ```bash # 检查语法错误(不执行) bash -n tt.sh ``` ### 典型错误修正案例 **错误代码(第5行附近):** ```bash for i in 1 2 3 # 缺少;或换行 do # 第5行报错 echo $i done ``` **修复方案:** ```diff - for i in 1 2 3 + for i in 1 2 3; do # 方案1:加分号 + for i in 1 2 3 # 方案2:换行 do ``` ### 预防措施 1. **开发环境规范** - 用 VS Code/Sublime 等编辑器,右下角切换为 **LF (Unix)** 换行符(非 CRLF) ```bash # 文件头部声明解释器(引用[2]) #!/bin/bash ``` 2. **语法检查工具** ```bash shellcheck tt.sh # 静态分析工具 ``` > **重要提示**:若脚本涉及数据库命令(如 `mysql`),需确保命令路径在 `PATH` 中(引用[1]),可通过 `which mysql` 验证可执行文件是否存在[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值