如何向 Bash 函数添加选项

如何向 Bash 函数添加选项

我是 Linux 新手(使用 Ubuntu 10.10),我想在 .bashrc 中添加一个启动/停止 tomcat 服务器的函数。我正在尝试解析命令“tomcat”的两个选项。我尝试了以下各种排列,但都不起作用。

export CATALINA_HOME=/tomcat/directory

function tomcat {
       if [$1 = "-s" ]; then
          `sh $CATALINA_HOME/bin/startup.sh`
       elif [$1 = "-x"]; then
          `sh $CATALINA_HOME/bin/shutdown.sh`
       else
          echo "Enter '-s' to start Tomcat, '-x' to shutdown."
       fi
    }

为什么这不起作用?正确的做法是什么?

谢谢!

答案1

把这里的所有内容放在一起,我认为这个代码会对你有用:

export CATALINA_HOME=/tomcat/directory

function tomcat {
    if [ "$1" = "-s" ]; then
        sh $CATALINA_HOME/bin/startup.sh
    elif [ "$1" = "-x" ]; then
        sh $CATALINA_HOME/bin/shutdown.sh
    else
        echo "Enter '-s' to start Tomcat, '-x' to shutdown."
    fi
}

与您的版本相比有重要变化:

  • 删除启动和关闭命令周围的反引号
  • 将变量括$1在双引号中

关于 bash 语法和安全性的一些注意事项:

  • function tomcat {相当于tomcat() {
  • [正如 @ooshro 指出的那样, after 后面需要一个空格if——如有疑问,请将其隔开
  • 在比较中,你应该选择=而不是==,因为单等号是其他 shell 使用的标准
  • 始终将变量(如$1)括在双引号中,尤其是在比较语句中,或者在任何省略它们会导致问题的地方
  • @ooshro 的case语法是处理此问题的更简洁的方法,但如果您计划在将来使代码变得更复杂,它的灵活性可能会降低
  • 反引号捕获命令的输出,然后将其替换到脚本中,因此,如果用反引号括住整行,bash 将执行该行,然后尝试执行输出,这很少是您想要的
  • 此脚本不需要反引号功能,但如果需要,我建议使用语法$(...),因为它可嵌套,而且在我看来更容易阅读和理解

答案2

尝试('[' 后缺少空格而导致的错误):

export CATALINA_HOME=/tomcat/directory

tomcat() {
        case "$1" in
            -s) ${CATALINA_HOME}/bin/startup.sh;;
            -x) ${CATALINA_HOME}/bin/shutdown.sh;;
            *) "Enter '-s' to start Tomcat, '-x' to shutdown."
        esac
}

答案3

“不起作用”是什么意思?你收到任何错误消息了吗?启动函数时会发生什么?

尝试始终在“[”和“]”之后和之前放置一个空格。

还将 $1 引用为“$1”。

而“=”应该是“==”,所以:

export CATALINA_HOME=/tomcat/directory

function tomcat {
   if [ "$1" == "-s" ]; then
      `sh $CATALINA_HOME/bin/startup.sh`
   elif [ "$1" == "-x" ]; then
      `sh $CATALINA_HOME/bin/shutdown.sh`
   else
      echo "Enter '-s' to start Tomcat, '-x' to shutdown."
   fi
}

对我有用。

相关内容