意外的'然后'bash脚本

时间:2013-04-18 20:59:04

标签: bash if-statement

如何修复此错误?我的语法没有任何问题。

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!"
}

我知道这是一个非常基本的脚本,但它是一个更大的脚本的一部分。错误发生在then语句中。

4 个答案:

答案 0 :(得分:5)

如果你来自其他编程语言,那么shell脚本往往比你可能习惯的空间更敏感(读:C)。您的if行存在问题。您可能正在寻找:

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

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

答案 1 :(得分:2)

问题是您需要if[之间的空格。缺乏空间让bash的解析器感到困惑。

答案 2 :(得分:2)

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

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

答案 3 :(得分: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
}

哦,是的,正如其他人所指出的,不要忘记空间:)