【问题标题】:Unexpected `then' bash script意外的 `then' bash 脚本
【发布时间】:2013-04-18 20:59:03
【问题描述】:

如何解决此错误?我看不出我的语法有什么问题。

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 语句上。

【问题讨论】:

  • 一个 bash 提示:使用 $(< filename) 而不是 $(cat filename) -- 前者是内置构造。

标签: bash if-statement


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢,我无法想象这是解决方案。你猜对了,我来自 C。
【解决方案2】:

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

【讨论】:

  • [] 之前之后 还需要有一个空格。
  • 是的,虽然它会在没有它的情况下解析,只是不运行。
  • 我很确定 OP 会返回“我的脚本不起作用,它显示 [$(cat...": command not found”。
  • 是的,这更像是对我对答案的双重检查并不涉及实际运行该函数这一事实的评论:-)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    略微重构(改进)的版本,依赖于 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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2014-08-19
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多