使用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行脚本来玩,你会吗?),你应该再次看看实际的变化。
甚至备份到以前的工作版本,然后再次进行更改,一次一个,仔细一次,直到您明白为什么打破了某些内容。
您对您的等号空间本节:
case $VERSION in
STR2)
VAR4 = "STR5"
VAR5 = "STR6"
VAR6 = "STR7"
VAR7 = "STR8"
拿这些出来,你可能行(除非这是一个张贴错误)。
那些会生成'command not found'错误,而不是语法错误。你说得对,他们是错误的,但他们可能不是麻烦的来源。 – 2010-09-29 05:01:41
是的,这只是格式化SO。好的发现虽然 - +1 – desertwebdesigns 2010-09-29 05:11:40
谢谢。我会尝试建议1并回复。我也明白我在问什么。我检查了我编辑过的失败行之间的部分。我确实有计划将此分解出来,但在那之前,这是一个野兽。幸运的是,我花了一个小时的长时间艰苦的任务下降到约5分钟:) – desertwebdesigns 2010-09-29 04:57:30
发现它!它在895线上。你说得对。我永远不会抓住它。出于某种原因,我遗失了一部分代码,但是我记得键入它。我试图用'var = $(($ var + 1)'''在循环中增加一个变量,我错过了'+ 1 ))'部分。再次感谢您的建议。我喜欢'bash -n',这绝对让测试变得更容易。不知道那个。 – desertwebdesigns 2010-09-29 05:10:35