2017-02-19 22 views
0

с кода ниже я получаю следующие ошибки:Bash Script - Invalid арифметический оператор

#!/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}' prints '12 file1.log', так что это значение' $ numLines'. 'numLines =" $ (wc -l <"$ {sourceFile}") "' должен дать вам только номер (кавычки бесплатны на этой неделе, наслаждайтесь). – Biffen

+1

Кажется, что 'echo 'недействительный файл'> & 2; выход 1' будет более уместным. Ошибки должны быть напечатаны на stderr, и сценарий должен возвращать ненулевое значение, если оно не выполняется. –

+0

Также '! -f "$ {sourceFile}" 'недопустимый код в' (()) ', возможно, попробуйте в квадратных скобках i.e' ((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}")" 

(The добавлены кавычки, поскольку это хорошая привычка. (Нет, они не строго, необходимые в этом случае.) (И да, Qoutes верны, даже если синтаксис синтаксиса SO не работает Похоже, что они их понимают.)

В сценарии есть другие проблемы (упомянутые в комментариях), но один вопрос за раз. Однако я воспользуюсь возможностью, чтобы рекомендовать ShellCheck.

+0

nit: «piping» содержимое файла может быть выполнено с помощью 'cat $ sourceFile | wc -l' (UUOC), но нет связи с 'wc -l <$ sourceFile'. Перенаправление не является каналом. –

+0

@WilliamPursell Хех, ленивый. Исправлена. Благодаря! – Biffen