簡體   English   中英

使用case語句時,bash語法錯誤

[英]bash syntax error when using case statement

我在工作中經常使用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

再次感謝。

問題可能在第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"

把那些拿出來,你可能會沒事的(除非那是一個發布錯誤)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM