无法找出“意外标记‘完成’附近的语法错误”问题

无法找出“意外标记‘完成’附近的语法错误”问题

我遇到错误“意外标记‘完成’附近的语法错误”,并且无法弄清楚脚本。我的代码如下:

trap "rm ~/tmp/* 2> /dev/null; exit" 0 1 2 3
phonefile=~/sournce/corp_phones
looptest=y
while [ $looptest" = y ]
do
   clear
   cursor 1 4; echo "Corporate Phone List Additions"
   cursor 2 4; echo "=============================="
   cursor 4 4; echo "Phone Number: "
   cursor 5 4; echo "Last Name   : "
   cursor 6 4; echo "First Name  : "
   cursor 7 4; echo "Middle Init : "
   cursor 8 4; echo "Dept #      : "
   cursor 9 4; echo "Job Title   : "
   cursor 10 4; echo "Date Hired  :"
   cursor 12 4; echo "Add Another? (Y)es or (Q)uit "
   cursor 4 18; read phonenum
   if [ "$phonenum" = 'q' ]
      then
         clear; exit
   fi
   cursor 5 18; read lname
   cursor 6 18; read fname
   cursor 7 18; read midinit
   cursor 8 18; read deptno
   cursor 9 18; read jobtitle
   cursor 10 18; read datehired
#check to see if last name is not a blank before write to disk
   if [ "$lname" >  "        "]
      then
         echo $phonenum:$lname:$fname:$midinit:$deptno:$jobtitle:$datehired >> $phonefile
   fi
   cursor 12 33; read looptest
   if [ "$looptest" = 'q' ]
      then
        clear; exit
   fi
done

答案1

你现在有3个障碍:

  1. 缺少双引号$looptest"-- 应该是"$looptest"
  2. 用于>比较"$lname" > ...-- 中的字符串应该是if [ "$lname" != ...
  3. 设置特定的 she-bang 行,以便使用您期望的 shell 解析脚本 - 无论是 bash、zsh、dash 还是普通 sh。

我将在这里花一点时间来调用 shellcheck.net 服务;您可以将代码粘贴到那里的框中,它会给您建议和警告。

答案2

SE 上突出显示的语法揭示了这个问题(与任何适当的编辑器中的情况相同),但您需要仔细阅读颜色并希望颜色足够清晰以区分。

while [ $looptest" = y ]
do
   cursor 7 4; echo "Middle Init : "
   cursor 8 4; echo "Dept #      : "
   cursor 9 4; echo "Job Title   : "
   ...
done

从引号 at 开始的所有内容$looptest"都显示为红色,因为它被视为带引号的字符串。下一个"停止引用,下一个又开始引用,因此脚本的引用和非引用部分是颠倒的。这一直持续到带有 的行#,当现在不加引号时,会在该行的末尾开始注释,删除"其后的效果,并恢复对脚本其余部分的引用。

shell 继续解析并看到关键字,done而它实际上是do在此之前期望的,因此出现错误。 (do当然,在引用时没有被识别。)

如果没有#,您会在下三行的括号中收到错误(它们是特殊的语法标记),如果没有它们,则会出现有关在查找结束引号时到达 EOF 的更具体的错误。

相关内容