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

时间:2010-09-29 04:38:19

标签: linux bash shell case syntax-error

我有bash脚本,我经常在我的工作中使用自动化大型工作。我今天做了一些改变,但一切似乎都很好。脚本本身大约有1700行。脚本的第一部分都很好,并且可以很好地运行所有用户输入和逻辑。然后它进入脚本的核心,并在875行停止工作(用bash -x测试脚本以找到断点)。但是,它打破了以下错误:

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

第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

再次感谢。

2 个答案:

答案 0 :(得分:3)

这个问题很可能介于第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行脚本,是吗?),您应该再次查看实际更改。

或者甚至回到之前的工作版本,然后再仔细地再次进行更改,直到你明白为什么要破坏某些东西。

答案 1 :(得分:2)

本节中您的等号周围有空格:

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

拿出那些,你可能没问题(除非这是一个发布错误)。