1

How do I fix this error? I can't see anything wrong with my syntax.

ipcheck() {
  echolog "[INFO] Enabling IP Forwarding..."
  sudo echo 1 > /proc/sys/net/ipv4/ip_forward
  if[$(cat /proc/sys/net/ipv4/ip_forward) == "0"]
    then
    echolog "[CRITICAL] Could not enable IP Forwarding!"
    exit 0
  fi
  echolog "[INFO] IP Forwarding successfully enabled!"
}

I know this is a very basic script, but it's part of a bigger one. The error happens on the then statement.

4

4 回答 4

5

如果您来自其他编程语言(阅读:C),Shell 脚本往往比您可能习惯的对空格更加敏感。你的if线路有问题。您可能正在寻找:

if [ $(cat /proc/sys/net/ipv4/ip_forward) == "0" ]

这里要记住的是,[它不是任何特殊if语法的一部分——它是程序的名称(有时是内置的 shell)。如果你这样想,你可以看到命令行解析器是如何需要它被分离的。类似地,[命令(或内置命令)期望关闭]与其他参数分开,因此您也需要在它之前有一个空格。

于 2013-04-18T21:01:41.900 回答
2

问题是您需要在if和之间留一个空格[。缺少空格会使 bash 的解析器感到困惑。

于 2013-04-18T21:01:45.337 回答
2

if在第 4 行的and部分之间放置一个空格。[$(cat...]要运行此脚本,您还需要]在同一行的 the 部分留一个空格。

在相关的说明中,如果您没有在 shell 脚本中使用缩进,您应该认真考虑它,因为它使您的代码的维护和易读性更加容易。

于 2013-04-18T21:01:49.353 回答
0

依赖 bash的稍微重构(改进)的版本:

#!/bin/sh

ipcheck() {
    echolog "[INFO] Enabling IP Forwarding..."
    sudo echo 1 > /proc/sys/net/ipv4/ip_forward || {
        echolog "[CRITICAL] Error echoing to ip_forward file"
        exit 1
    }

    # Paranoia check :)
    status=$(cat /proc/sys/net/ipv4/ip_forward)
    [ "$status" = "1" ] || {
        echolog "[CRITICAL] Could not enable IP Forwarding!"
        exit 1  # 1 is error in scripts, 0 is success
    }
    echolog "[INFO] IP Forwarding successfully enabled!"
}

最好做一个error()函数,也许是这样的:

# Call it like: error "[INFO] Could not ..."
error() {
    echolog "$*"
    exit 1
}

哦,是的,正如其他人指出的那样,不要忘记空格:)

于 2013-04-18T21:07:37.703 回答