2017-02-13 148 views
0

下面是我的腳本的代碼段在運行它會拋出錯誤:擊:語法錯誤:「(」意外

echo "#include \"Factory.H\"" > $1 
echo "#include \"Stub.H\"" >> $1 
echo "#include \"Ref.H\"" >> $1 

# 
# a loop to include all of the headers for the stubs. 
# 
ARGS=("[email protected]") 
for ((i = 1; $i < $#; i=$i+2)) ; do 
    echo ${ARGS[$i]} 
    echo "#include \"${ARGS[$i]}.H\"">> $1 
done 

ARGS=("[email protected]")報告的錯誤,我無法弄清楚這是爲什麼。報告爲一個錯誤的腳本被調用,有以下輸入

..//scripts/makestubfactory ./obj/_stubfactory.C RegistryImpl_Stub "com.frco.fievel.comm.registry.RegistryImpl_stub" ObserverBrokerImpl_Stub "com.frco.fievel.observer.ObserverBrokerImpl_stub" SubjectAccessImpl_Stub "com.frco.fievel.observer.SubjectAccessImpl_stub" 

請闡明如何來解決這個問題,一些燈光

+0

如果您有報價$# –

+0

'$#'開頭不需要引用。 – codeforester

+0

爲了提高效率,可以將「$ 1」部分保留在循環之外。 '完成>>「$ 1」'。 – codeforester

回答

2

你需要確保你的腳本在Bash shell中運行,因爲一個標準的POSIX外殼(這是什麼sh可能是您的系統上)沒有實現陣列。要做到這一點,你應該添加shebang行作爲腳本的第一行:

#!/usr/bin/bash 

路徑/usr/bin/bash必須是完整路徑bash可執行文件,這可能是在你的機器上的其他位置。有些人喜歡使用

#!/usr/bin/env bash 

將發現bash無論它是在PATH,但需要env是在固定的位置。

您可以通過使用命令找到的路徑,從bash的bash的可執行文件:

which bash 

有一些可能對這個腳本進行改進,其中一些我所提到的快速瀏覽:

  1. 您可以使用單引號,以避免反斜槓轉義雙引號(但只有當你沒有你的字符串中的單引號或可變擴展)。可變擴張,而另一方面,應該被引用:

    echo '#include "Factory.H"' > "$1" 
    
  2. 更妙的是,使用這裏-doc的複製整個模板:

    cat >"$1" <<"EOF" 
    #include "Factory.H" 
    #include "Stub.H" 
    #include "Ref.H" 
    EOF 
    
  3. 你並不真的需要一個數組,因爲你可以使用bash的間接運算符來訪問命令行參數:

    for ((i=2; i<$#; i+=2)); do 
        echo "${!i}" 
        echo "#include \"${!i}\".H" >> "$1" 
    done 
    

    注意使用i+=2而非i=$i+2

    另一種解決方案,使用printf輸出所有的參數在一個調用:

    printf '#include "%s.H"\n%.0s' "${@:2}" 
    

    這利用的,殼printf實用程序不斷重複的格式,直到它已用完了所有的參數,這一事實可以非常有幫助。在這種情況下,我使用%.0s(即打印最大長度爲0的字符串)不打印奇數參數。"${@:2}"是bash的擴展,它是像"[email protected]"只是它的參數2.

+0

這似乎不是shebang線的問題。 – codeforester

+1

我的腳本在腳本的頂部有'#!/ bin/sh',因此我遇到了這個問題。感謝您指出「'sh'沒有實現數組」。我將'#!/ bin/sh'行改爲'#!/ usr/bin/env bash',現在可以正常工作。 – Panch

+1

@codeforester:顯然在*你的系統上,'sh'是'bash'。並非每個人都以這種方式配置他們的機器 – rici

-1

試試這個:

echo "#include \"Factory.H\"" > $1 
echo "#include \"Stub.H\"" >> $1 
echo "#include \"Ref.H\"" >> $1 

# 
# a loop to include all of the headers for the stubs. 
# 
ARGS=("[email protected]") 
for ((i = 1; $i < [email protected]; i=$i+2)) ; do 
    echo ${ARGS[$i]} 
    echo "#include \"${ARGS[$i]}.H\"">> $1 
done 
+1

'$我<$ @'是錯誤的。 – codeforester