2010-09-29 72 views
0

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

再次感謝。

回答

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行腳本來玩,你會嗎?),你應該再次看看實際的變化。

甚至備份到以前的工作版本,然後再次進行更改,一次一個,仔細一次,直到您明白爲什麼打破了某些內容。

+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

2

您對您的等號空間本節:

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