Como adicionar opções à função Bash

4

Sou novo no linux (usando o Ubuntu 10.10) e gostaria de adicionar uma função ao .bashrc que inicia / pára um servidor tomcat. Estou tentando analisar duas opções para o comando "tomcat". Eu tentei o seguinte em várias permutações, mas nenhuma delas funciona.

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
    }

Por que isso não funciona? Qual é o caminho certo para fazer isso?

Obrigado!

    
por Erasmus777 16.02.2011 / 18:01

3 respostas

3

Colocando tudo junto aqui, acho que esse código funcionará para você:

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
}

Alterações importantes da sua versão:

  • Removidos backquotes dos comandos de inicialização e desligamento
  • Cercou a variável $1 entre aspas duplas

Algumas notas sobre sintaxe e segurança do bash:

  • function tomcat { é equivalente a tomcat() {
  • Como aponta @ooshro, é necessário um espaço após o [ após if - em caso de dúvida, expanda
  • nas comparações, você deve preferir = over == , já que single-equals é o padrão que outras shells utilizam
  • sempre envolvem variáveis (como $1 ) entre aspas duplas, especialmente nas instruções de comparação, ou em qualquer lugar onde deixá-las fora causaria um problema
  • @ a sintaxe case do ooshro é uma maneira mais concisa de lidar com esse problema, mas pode ser menos flexível se você planeja tornar seu código mais complicado no futuro
  • backquotes capturam a saída de um comando e o substituem no script, portanto, se você envolver uma linha inteira com backquotes, o bash executará essa linha e tentará executar a saída, o que raramente é o que você provavelmente deseja
  • Você não precisa recuar a funcionalidade desse script, mas, quando fizer isso, sugiro usar a sintaxe $(...) , pois ela é encaixável e, na minha opinião, é muito mais fácil de ler e entender
por 16.02.2011 / 18:25
2

Tente (erro na falta de espaço após '['):

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
}
    
por 16.02.2011 / 18:11
1

O que você quer dizer com "não funciona"? Você recebe alguma mensagem de erro? O que acontece quando você inicia sua função?

Tente colocar um espaço sempre depois e antes do "[" e "]".

Também cite $ 1 como "$ 1".

E "=" deve ser "==", então:

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
}

funciona para mim.

    
por 16.02.2011 / 18:10

Tags