2017-02-19 129 views
0

與下面的代碼中,我不斷收到以下錯誤:bash腳本 - 無效的算術運算符

#!/bin/bash 
    sourceFile="file1.log" 
    targetFile="/etc/network/interfaces" 
    numLines=$(wc -l ${sourceFile}) 
    if ((counter >= "$numLines" || ! -f "${sourceFile}")); then 
      echo "invaild file" 
      exit 0 
    fi 
    while [ "$counter" -le "$numLines" ]; do 
      sed -i "${2} s/.*/wireless-key s: $(sed -n "${counter}"p <<< "${sourceFile}")/" "${targetFile}" 
      counter=$((counter + 1)) 
    done 

與上面的代碼中,我不斷收到以下錯誤:

> ./2test.sh: line 5: ((: counter >= 12 file1.log || ! -f file1.log : syntax error: invalid arithmetic operator (error token is ".log || ! 
    > -f file1.log ") ./2test.sh: line 9: [: : integer expression expected 
+2

'wc -l $ {sourceFile}'打印'12 file1.log',這就是'$ numLines'的值。 'numLines =「$(wc -l <​​」$ {sourceFile}「)」'應該只給你數字(本週引用是免費的,享受)。 – Biffen

+1

看起來像'echo'無效文件'>&2; 1號出口會更合適。錯誤應打印到stderr,如果失敗,腳本應該返回非零值。 –

+0

另外'! -f「$ {sourceFile}」'在'(())'中不是有效的代碼,也許可以在方括號中嘗試它,例如'((counter> =「$ numLines」))|| [[!! -f「$ {sourceFile}」]]' – 123

回答

2

把我的評論成爲答案。

wc有一個明確的文件名包含在輸出文件名,所以:

wc -l ${sourceFile} 

打印:

12 file1.log 

這則$numLines值。

線索是錯誤消息:它包括擴展的表達:

> ./2test.sh: line 5: ((: counter >= 12 file1.log || ! -f file1.log : syntax error[…] 
            ^^^^^^^^^^^^ 

您可以避免通過重定向文件的內容wc而不是讓該文件名:

numLines="$(wc -l < "${sourceFile}")" 

(該(不,他們不是嚴格在這種情況下是必要的。)(是的,qoutes是正確的,即使SO的語法熒光筆doesn )似乎並不理解他們。)

腳本中還有其他問題(在評論中提到),但一次只有一個問題。不過,我會藉此機會推薦ShellCheck

+0

nit:「管道」文件的內容可以用'cat $ sourceFile | wc -l'(UUOC),但是沒有涉及'wc -l <​​$ sourceFile'的管道。重定向不是管道。 –

+0

@WilliamPursell嘿,懶我。固定。謝謝! – Biffen