解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi'错误的问题

本文介绍如何使用NodePad++编辑Linux脚本,并解决因Windows与Linux行尾符不同导致的语法错误。通过更改文件格式为Unix格式,确保脚本在Linux环境中正确执行。

        我们在编辑Linux服务器上的文件时,如果直接在Linux环境下编辑的话,比较麻烦,大段粘贴格式比较乱,还得自己一行一行去调整,因此会选择用编辑器来编辑我们Linux环境下的文件,我用的是NodePad++,大家可以参考http://blog.csdn.net/u012453843/article/details/52987666这篇博客来学习如何使用NodePad++来编辑Linux系统的文件。

       今天我要说的重点是,我们在用NodePad++编辑完脚本文件并上传到服务器后,直接运行脚本报错的问题,比如我要在NodePad++编辑器中编辑下面这段脚本

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
	/usr/local/nginx/sbin/nginx
	sleep 2
	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
		killall keepalived
	fi
fi
      先来说说第一个错误:syntax error: unexpected end of file,大家可以把上面那段脚本内容放到脚本文件nginx_check.sh当中(当然大家可以随便起个名字,后缀是.sh就可以了),需要注意的是最后一个"fi",默认是黑色字体,我们敲回车增加一行,这时最后那个"fi"颜色就变成蓝色了,如下图所示。

      

         编辑完该脚本我们保存,自动就会上传到Linux服务器,下面我们便在Linux服务器执行该脚本(需要注意的是,该脚本文件一定要有执行权限,如果没有执行权限就使用chmod +x nginx_check.sh来给脚本增加执行权限),我们会看到如下所示的错误,提示结尾不合法。

[root@bhz004 keepalived]# sh ./nginx_check.sh 
./nginx_check.sh: line 10: syntax error: unexpected end of file
[root@bhz004 keepalived]# 
         我们再来看另外一个错误:syntax error near unexpected token `fi',大家可以直接把脚本内容粘贴到脚本文件中,最后一个"fi"此时是黑色的,我们不用管它。


          这时我们执行该脚本,会看到如下所示错误,提示第9行"fi"有问题。

[root@bhz004 keepalived]# sh ./nginx_check.sh 
./nginx_check.sh: line 9: syntax error near unexpected token `fi'
./nginx_check.sh: line 9: `fi'
[root@bhz004 keepalived]# 
        上面两个问题都是由于.sh文件的格式为dos格式。而linux只能执行格式为unix格式的脚本。因为在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)”,所以修改的sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令。

        我们可以查看该脚本文件的格式,方法是使用命令:vim nginx_check.sh进入编辑文件界面,如下图所示。


         直接输入":",然后在":"之后输入"set ff"如下图所示


        回车即可看到脚本格式,如下图所示,可以看到当前脚本格式是dos。


         我们需要把格式改为unix,方法是输入":set ff=unix",也可以输入":set fileformat=unix"如下图所示。


       输入完之后,回车即可完成切换格式。然后我们再输入":set ff"来查看格式,如下图所示,可以看到当前脚本格式变成了我们想要的"unix"了。


       这时我们再执行nginx_check.sh就没问题了,如下所示。

[root@bhz004 keepalived]# sh ./nginx_check.sh 
[root@bhz004 keepalived]# ps -ef | grep nginx
root       3679      1  0 19:42 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     3681   3679  0 19:42 ?        00:00:00 nginx: worker process      
root       3711   1898  0 20:23 pts/0    00:00:00 grep nginx
[root@bhz004 keepalived]# 




<think>好的,用户遇到了一个shell错误,具体是执行test.sh时提示第5行有语法错误unexpected end of file”。我需要根据提供的引用资料和之前的知识来帮助解决这个问题。首先,我需要回忆常见的导致这种错误的原因。 根据引用3,这种错误通常有两种原因:文件格式问题和语法结构问题。用户可能是在Windows系统下编写了本,导致换行符是CRLF(dos格式),而Linux需要unix格式(LF)。这时候需要用vimdos2unix工具转换格式。此外,另一个常见原因是代码结构不完整,比如循环条件语句没有正确结束,比如for循环缺少done,者if语句没有fi。 接下来,用户提供的错误信息指出是第5行的问题。需要检查第5行附近的代码结构是否正确。例如,是否有未闭合的do...done结构,者括号、引号没有正确闭合。比如引用2中的示例,for循环没有用done结束,导致语法错误。所以用户需要检查本中的for、while、if等结构是否完整闭合。 另外,引用1和引用3提到了文件格式的问题,用户需要确认本的格式是否是unix而非dos。可以使用vim的:set ff=unix来转换,者使用dos2unix命令。 可能的解决方案步骤:首先检查本结构是否正确,尤其是第5行附近的循环条件语句是否闭合。然后检查文件格式是否为unix。如果结构没问题,再考虑是否有其他语法错误,比如括号引号未闭合。 可能需要用户提供test.sh的部分代码以进一步诊断,但用户没有提供,所以需要给出通用的解决步骤。建议用户先用vim查看文件格式,并用cat -v显示隐藏字符,检查是否有特殊符号导致的问题。另外,建议检查是否有here文档未正确结束的情况,比如<<EOF后没有EOF结尾。 总结处理步骤:1. 检查语法结构是否正确闭合;2. 转换文件格式为unix;3. 检查隐藏字符特殊符号。</think>### 分步解决方案 #### 1. **检查语法结构闭合性** - **循环/条件语句闭合**:确认`for/while`循环是否以`done`结尾,`if`语句是否以`fi`结尾,`case`是否以`esac`结尾 ```bash # 错误示例(缺少done): for i in {1..3}; do echo $i # 正确示例: for i in {1..3}; do echo $i done ``` - **函数定义闭合**:确保函数体以`}`闭合 ```bash # 错误示例: myfunc() { echo "hello" # 正确示例: myfunc() { echo "hello" } ``` #### 2. **检查文件格式是否为UNIX** - **使用vim转换格式**: ```bash vim test.sh # 输入命令 :set ff=unix :wq ``` - **使用dos2unix工具**(需安装): ```bash dos2unix test.sh ``` #### 3. **检查隐藏字符特殊符号** - **用cat -v显示控制字符**: ```bash cat -v test.sh ``` 若发现`^M`(Windows换行符),需进行格式转换[^3]。 #### 4. **验证Here Document语法** - 确保`<<EOF`后存在对应的`EOF`结尾 ```bash # 错误示例: cat <<EOF Hello World # 正确示例: cat <<EOF Hello World EOF ``` ### 示例验证 假设`test.sh`内容如下: ```bash #!/bin/bash for i in {1..3}; do echo "Line $i" # 缺少done ``` 执行时会报错: ```bash $ bash test.sh test.sh: line 5: syntax error: unexpected end of file ``` **解决方法**:补全`done`语句即可修复。 ### 相关问题 1. 如何排查Shell本中的`unexpected token`错误? 2. Shell本中`^M`符号的成因和解决方法? 3. 如何调试复杂的Shell本逻辑错误? [^1]: 文件格式问题会导致解释器无法正确解析换行符 [^2]: 语法结构缺失是Shell本常见错误来源 [^3]: 使用`cat -v`可辅助排查隐藏字符问题
评论 37
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值