使用case语句时出现bash语法错误

问题描述:

我在工作中经常使用bash脚本来自动执行大型作业。我今天正在做一些改变,但一切似乎都很好。剧本本身长约1700行。脚本的第一部分都很好,并贯穿所有的用户输入和逻辑。然后进入脚本的核心并停止工作,直到875行(使用bash -x测试脚本以找到断点)。然而,它打破了以下错误:1341使用case语句时出现bash语法错误

script.sh: line 1341: syntax error near unexpected token `;;' 
script.sh: line 1341: `     ;;' 

线处于case语句的中间。下面的代码是代码块的地方是打破开头:

if [[ $VAR1 = "TRUE" && $VAR2 = "VAL2" ]]; then 
VERSION=`XXXXXXXXXXXXXXXX` 
## Set variables based on location $VAR3 
case $VAR3 in 
    STR1) 
     case $VERSION in 
      STR2) 
       VAR4 = "STR5" 
       VAR5 = "STR6" 
       VAR6 = "STR7" 
       VAR7 = "STR8" 
Line 1341 ---> ;; 
      STR3) 
       VAR4="STR9" 
       VAR5="STR10" 
       VAR6="STR11" 
       VAR7="STR12" 
       ;; 
      STR4) 
       VAR4="STR13" 
       VAR5="STR14" 
       VAR6="STR15" 
       VAR7="STR16" 
       ;; 
     esac 
     VAR8="STR17" 
     VAR9="STR18" 
     VAR10=1 
     VAR11="STR19" 
     ;; 

因为我做什么敏感性质的,我明明不得不删除相当多的信息。我知道这可能会让事情变得更难以帮助我。然而,所有的VAR ## =“STR ##”都是带有字符串值的标准变量声明,没有什么特别的(没有变量替换等)。所有变量稍后将在脚本中使用。 VERSION的代码返回一个字符串值,用于嵌套的case

脚本工作正常,直到今天我的变化,但我真的没有触及此部分,除了调整一些STR值。我尝试在引号“”中设置$VAR3$VERSION变量,以及用作案例的STR值。我试图完全取出这个块,只是让它在下一个块上失败(STR1有一个不同的值,因此改变了变量声明)。我把它输出到控制台它在做什么以及在大多数函数之后检查错误。在控制台上没有什么不寻常的东西,错误日志中没有任何东西。

任何帮助将不胜感激,我知道我问了很多。

顺便说一句,这里是脚本停止运行的第875行的代码(没有根据代码生成错误)。再次,bash -x我可以看到VAR2变量被设置,但脚本在下一个for循环开始之前中断。

## Create file ## 
echo 'Creating files . . . ' 
j=0 
p=1111 
if [ $VAR1 = "TRUE" ] 
    then 
     VAR2=1 
else 
    VAR2=2 
fi 
for i in `seq 1 $HOWMANY`; do <----Line 875 
echo -n "Creating file . . . " 
echo "XXXXXXXXXXX 

再次感谢。

该问题可能位于第875行(或稍早)和第1341行之间的某个位置。可能是错误的报价或不太精细的内容。如果没有这些产品线之间的所有原始材料,我们将无法进行调试。

建议1:用'bash -n -v'运行,看看是否能让你对问题有所了解。

建议2:将脚本拆分为更容易管理的小块,并且可以单独进行调试。我拥有的最大脚本(在我的bin目录中有400个)来自autoconf套件 - 它们的重量仅为1100线以下;下一个最大的是我的,而750线脚本也是d..n大。接下来最大的脚本是600到700行Perl(包括Perl文档)。


说了“失踪引号”,我看你的片段接近行875具有:

echo -n "Creating file . . . " 
echo "XXXXXXXXXXX 

从第二回声缺少结束双引号。


您还提到进行更改,尽管不会接近脚本中断点。既然你拥有版本控制下的代码(你不会想用没有备份的1700行脚本来玩,你会吗?),你应该再次看看实际的变化。

甚至备份到以前的工作版本,然后再次进行更改,一次一个,仔细一次,直到您明白为什么打破了某些内容。

+0

谢谢。我会尝试建议1并回复。我也明白我在问什么。我检查了我编辑过的失败行之间的部分。我确实有计划将此分解出来,但在那之前,这是一个野兽。幸运的是,我花了一个小时的长时间艰苦的任务下降到约5分钟:) – desertwebdesigns 2010-09-29 04:57:30

+0

发现它!它在895线上。你说得对。我永远不会抓住它。出于某种原因,我遗失了一部分代码,但是我记得键入它。我试图用'var = $(($ var + 1)'''在循环中增加一个变量,我错过了'+ 1 ))'部分。再次感谢您的建议。我喜欢'bash -n',这绝对让测试变得更容易。不知道那个。 – desertwebdesigns 2010-09-29 05:10:35

您对您的等号空间本节:

case $VERSION in 
      STR2) 
       VAR4 = "STR5" 
       VAR5 = "STR6" 
       VAR6 = "STR7" 
       VAR7 = "STR8" 

拿这些出来,你可能行(除非这是一个张贴错误)。

+0

那些会生成'command not found'错误,而不是语法错误。你说得对,他们是错误的,但他们可能不是麻烦的来源。 – 2010-09-29 05:01:41

+0

是的,这只是格式化SO。好的发现虽然 - +1 – desertwebdesigns 2010-09-29 05:11:40