Shell Script Syntax Error: Unexpected End of File
在以下脚本中,我收到一个错误:
syntax error: unexpected end of file
这个错误是什么我可以恢复它? 它指向调用函数的行。
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #!/bin/sh expected_diskusage="264" expected_dbconn="25" expected_httpdconn="20" expected_cpuusage="95" #expected_fd="100" httpdconn=`ps -ef|grep -i httpd|grep -v grep|wc -l` #httpd connections cpu_usage=`ps aux|awk 'NR > 0 { s +=$3 }; END {print s}'` disk_usage=`df -h|awk {'print $2'}|head -n3|awk 'NF{s=$0}END{print s}'` #db_connections=`mysql -uroot -pexxxxxx -s -N -e"show processlist"|wc -l` db_connections=6 cld_alert() { nwconn=$1 cpu_usage=$2 disk_usage=$3 db_connections=$4 message=$5 `touch /tmp/alert.txt && > /tmp/alert.txt` date=`date` echo -e"$date "> /tmp/alert.txt echo -e"$message">> /tmp/alert.txt path="/proc/$httpd/fd/"; cd $path tfd=`ls -l|wc -l`; sfd=`ls -ltr|grep sock|wc -l`; echo"Total fds: $tfd">> /tmp/alert.txt echo"Socket fds: $sfd">> /tmp/alert.txt echo"Other fds: $[$tfd - $sfd]">> /tmp/alert.txt freememory=`vmstat | awk '{if (NR == 3) print"Free Memory:"\$4}'`; echo"Free memory :$freememory">> /tmp/alert.txt Bufferedmemory=`vmstat | awk '{if (NR == 3) print"Buffered Memory:"\$5}'`; echo"Buffered memory $Bufferedmemory">> /tmp/alert.txt CacheMemory=`vmstat | awk '{if (NR == 3) print"Cache Memory:"\$6}'`; echo"Cache memory : $CacheMemory">> /tmp/alert.txt sshconn=`netstat -an|grep 22|wc -l` #ssh connections httpsconn=`netstat -an|grep 443|wc -l` #https connections wwwconn=`netstat -an|grep 80|wc -l` #www connections echo"Disk usage is $disk_usage">> /tmp/alert.txt echo"DB connections $db_connections">> /tmp/alert.txt echo"Network connections $nwconn">> /tmp/alert.txt echo"CPU Usage: $cpu_usage">> /tmp/alert.txt topsnapshot=`top -n 1 -b` echo"===========================TOP COMMAND SNAPSHOT===================================================="; echo"$topsnapshot">> /tmp/alert.txt echo"==================PS COMMAND SNAPSHOT==============================================================" entireprocesslist=`ps -ef` echo"$entireprocesslist">> /tmp/alert.txt echo Hello hi""; } message="" if [ ${disk_usage%?} -le $expected_diskusage ] ##{x%?} Removes last character then echo"disk usage exceeded"; message="Disk usage limit exceeded Current disk usage is $disk_usage Configured disk usage is $expected_diskusage "; #Checking for CPU usage if [ $cpu_usage -ge $expected_cpuusage] ##{x%?} then echo"CPU usage exceeded"; if [ $message -ne"" ] then message="$message CPU usage exceeded configured usage limit Current CPU usage is $cpu_usage Configured CPU usage is $expected_cpuusage "; else message="CPU usage exceeded configured usage limit Current CPU usage is $cpu_usage Configured CPU usage is $expected_cpuusage "; fi ; fi #Checking for httpd connections if [ $httpdconn -ge $expected_httpdconn] ##{x%?} then echo"HTTPD connections exceeded"; if [ $message -ne"" ] then message="$message HTTPD connections exceeded configured usage limit Current HTTPD connections is $httpdconn Configured HTTPD connection is $expected_httpdconn"; else message="HTTPD connections exceeded configured usage limit Current HTTPD connections is $httpdconn Configured HTTPD connection is $expected_httpdconn"; fi ; fi ; message="$message "; value=$(cld_alert $message $httpdconn $cpu_usage $disk_usage $db_connections) |
编辑:请注意,自编写此答案并重新格式化以来,原始帖子已被编辑。您应该查看历史记录以查看原始格式以了解此答案的上下文。
当您的结构不匹配时,通常会发生此错误 - 也就是说,您没有匹配的双引号,匹配单引号,没有关闭控件结构,例如缺少
发现这些的最佳方法是使用正确的缩进,它将显示您控制结构损坏的位置,以及语法突出显示,它将显示引号不匹配的位置。
在这种特殊情况下,我可以看到你错过了
清理代码,错误开始凸显出来。
在我的情况下,问题出在EOL转换中。 (行结束)。
我在Windows上创建了文件,只有在我将EOL从Windows(CR LF)转换为unix(LF)后,一切都进展顺利。
我很容易从Notepad ++进行转换:编辑 - > EOL转换 - > Unix(LF)
在我的情况下,我发现放置一个here文档(如sqplus ... << EOF)语句缩进也会引发相同的错误,如下所示:
1 | ./dbuser_case.ksh: line 25: syntax error: unexpected end of file |
所以在删除了这个缩进后,它就没问题了。
希望能帮助到你...
我发现这有时是由运行MS Dos版本的文件引起的。如果是这种情况,dos2ux应该解决这个问题。
1 | dos2ux file1 > file2 |
在cygwin中运行一些脚本时遇到了这个问题。通过在脚本上运行
使用块时的缩进可能会导致此错误,很难找到。
1 2 3 4 5 6 | if [ ! -d /var/lib/mysql/mysql ]; then /usr/bin/mysql --protocol=socket --user root << EOSQL SET @@SESSION.SQL_LOG_BIN=0; CREATE USER 'root'@'%'; EOSQL fi |
=>上面的示例将导致错误,因为EOSQL是缩进的。删除缩进,如下所示。发布这个是因为我花了一个多小时来弄清楚错误。
1 2 3 4 5 6 | if [ ! -d /var/lib/mysql/mysql ]; then /usr/bin/mysql --protocol=socket --user root << EOSQL SET @@SESSION.SQL_LOG_BIN=0; CREATE USER 'root'@'%'; EOSQL fi |
1 | echo"==================PS COMMAND SNAPSHOT==============================================================" |
需要是
1 | echo"==================PS COMMAND SNAPSHOT==============================================================" |
否则,搜索名为
更多问题:
如果你做一个grep(-A1:+ 1行上下文)
1 | grep -A1"if" cldtest.sh |
你会发现一些嵌入式ifs,以及4个if / then块。
1 | grep"fi" cldtest.sh |
只显示3个匹配的fi语句。所以你也忘记了一个。
我同意camh,从一开始就正确的缩进有助于避免这种错误。后来找到所需的方法意味着在这种意大利面条代码中加倍工作。
与OP的问题无关,但我的问题是我是一个noob shell脚本编写者。我使用的所有其他语言都需要使用括号来调用方法,而shell似乎并不喜欢这样。
1 2 3 4 5 6 7 8 9 | function do_something() { # do stuff here } # bad do_something() # works do_something |
你有一个未闭合的引号,大括号,括号,if,loop或者其他东西。
如果您只是通过查看看不到它(我建议使用语法着色编辑器和简洁的缩进样式),请获取脚本的副本,并删除其中的一半,将其剪切到应该有效的位置。如果脚本尽可能运行,则问题出在另一半。重复,直到你缩小问题范围。
它也可能是由一条线上的一对花括号引出的。
这失败了:
1 2 3 4 5 | { /usr/local/bin/mycommand ; outputstatus=$? } >> /var/log/mycommand.log 2>&1h do_something #Get NOW that saved output status for the following $? invocation sh -c"exit $outputstatus" do_something_more |
虽然这是允许的:
1 2 3 4 5 6 7 8 | { /usr/local/bin/mycommand outputstatus=$? } >> /var/log/mycommand.log 2>&1h do_something #Get NOW that saved output status for the following $? invocation sh -c"exit $outputstatus" do_something_more |
我在尝试使用textpad执行在Windows操作系统中创建的脚本文件时遇到了同样的错误。这样可以选择正确的文件格式,如unix / mac等..或者在linux iteself中重新创建脚本。
有用的帖子,我发现我的错误是使用
1 2 3 4 5 | if [ -z"$VARIABLE1" ]; then # do stuff else if [ -z"$VARIABLE2" ]; then # do other stuff fi |
通过改为这个来修正它:
1 2 3 4 5 | if [ -z"$VARIABLE1" ]; then # do stuff elif [ -z"$VARIABLE2" ]; then # do other stuff fi |