Bash脚本 - 无效的算术运算符

时间:2017-02-19 13:30:48

标签: linux bash unix

使用以下代码我不断收到以下错误:

#!/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

1 个答案:

答案 0 :(得分: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的语法荧光笔似乎也不太了解它们。)

脚本中还有其他问题(在评论中提到),但一次只有一个问题。不过,我会借此机会推荐ShellCheck