Funções Bash e variáveis ​​locais

Conteúdo

Esta postagem irá demonstrar como as funções de variáveis ​​locais são usadas e criadas no Bash. A criação de funções bash permite que você torne seu código mais estrutural, e as variáveis ​​locais ajudam na segurança e evitam erros de codificação. Mergulhe!

Quais são Funções Bash?

Da mesma forma que outras linguagens de codificação, O Bash permite que você crie funções a partir do seu código ou script. Uma função pode ser definida para realizar uma tarefa específica, ou um conjunto de tarefas, y se puede llamar fácil y rápidamente desde su código principal simplemente usando el nombre dado a la función.

Además puede anidar llamadas a funciones (llamar a una función desde dentro de otra función), utilizar variables locales dentro de la función e inclusive pasar variables de un lado a otro con funciones, o a través de el uso de variables globales. Vamos a explorar.

Función de golpe simple

Definimos un test.sh con nuestro editor de texto, na próxima maneira:

#!/bin/bash

welcome(){
eco "welcome"
}

welcome

Subseqüentemente, hacemos que ese archivo sea ejecutable agregando la ejecución (x) propiedad y ejecute el script:

chmod +x test.sh
./test.sh

Una función Bash simple

Podemos ver cómo el script establece primero un welcome() función usando los modismos de Bash function_name(), e {} envoltorios de funciones. Em conclusão, llamamos bienvenida a la función simplemente usando su nombre, welcome.

Cuando se ejecuta el script, lo que sucede en segundo plano es que se anota la definición de la función, pero se omite (Em outras palavras, no se ejecuta), hasta que un poco más baja la llamada a la función. welcome es golpeado, y en qué punto el intérprete de Bash ejecuta el welcome function y regresa a la línea de forma directa después de la llamada a la función, que para este caso es el final de nuestro script.

Pasando variables a funciones Bash

Definimos un test2.sh con nuestro editor de texto favorito (nós;), na próxima maneira:

#!/bin/bash

if [ -Com "${1}" ]; then 
  echo "One option required!"
  saída 1
fi

func1(){
  eco "${1}"
}

func2(){
  eco "${2} ${1}"
}

func1 "${1}"
func2 "uma" "b"

Nuevamente hacemos que nuestro script sea ejecutable usando chmod +x test2.sh y ejecutar lo mismo.

Una función Bash más avanzada con paso variable

O resultado resultante pode parecer interessante ou até mesmo confuso no início.. Apesar disto, é lógico e fácil de seguir. A primeira opção passada para o script será, globalmente, disponível a partir de código como ${1}, exceto funções internas, Onde ${1} torna-se o primeiro parâmetro passado para a função, ${2} o segundo, etc.

Em outras palavras, o global ${1} variável (a primeira opção passada para o script a partir da linha de comando) não habilitado nas funções, onde o significado do ${1} A variável muda para a primeira opção passada para a função. Pense sobre a hierarquia ou como uma função poderia apresentar um pequeno script por conta própria e isso logo fará sentido.

Como uma nota rodapé, também poderia ser usado $1 ao invés de ${1}, mas eu recomendo altamente programadores de bash aspirantes a sempre cercar nomes de variáveis ​​com { e }.

A razão é que às vezes, ao usar variáveis ​​em uma string, como um exemplo, o executor de bash não pode Assistir onde uma variável termina e parte do texto anexado pode ser considerada como parte do nome da variável onde não é, que gera uma saída inesperada. Também é mais limpo e claro qual é a intenção, especialmente quando se trata de arrays e sinalizadores alternativos especiais.

Por tanto, começamos nosso programa com o ${1} variável definida para "first". Se você olhar para a vocação de func1, você verá que passamos essa variável para a função, então o ${1} dentro da função torna-se o que estava no ${1} do programa, Em outras palavras "first", e é por isso que a primeira linha de saída é, na verdade, first.

Então ligamos func2 e passamos dois tópicos "a" e "b" para a função. Mais tarde, estes se tornam o ${1} e ${2} automaticamente dentro do func2 Função. Função interna, nós os imprimimos de cabeça para baixo, e nossa saída combina muito bem com b a como a segunda linha de partida.

Em conclusão, também fazemos uma verificação no topo do nosso script para garantir que uma opção seja realmente passada para o test2.sh script verificando se "${1}" está vazio ou não usa o -z teste dentro if comando. Saímos do script com um código de saída diferente de zero (exit 1) para indicar aos programas de chamada que algo deu errado.

Variables locales y valores de retorno

Para nosso exemplo final, definimos un script test3.sh de la próxima manera:

#!/bin/bash

func3(){
  local REVERSE="$(eco "${1}" | rev)"
  eco "${REVERSE}"
}

INPUT="abc"
REVERSE="$(func3 "${ENTRADA}")"
eco "${REVERSE}"

De nuevo lo hacemos ejecutable y ejecutamos el script. La salida es cba como se puede esperar escaneando el código y anotando los nombres de las variables, etc.

Ejemplo con variables locales y valores devueltos

Apesar disto, el código es complejo y lleva un poco acostumbrarse. Vamos a explorar.

Primeiro, definimos una función func3 en el que creamos una variable local llamada REVERSE. Atribuímos um valor a ele chamando uma subcamada ($()), e de dentro desta subcamada nós ecoamos o que foi passado para a função (${1}) e canalizar esta saída para rev comando.

a rev O comando imprime a entrada recebida do tubo (de outro modo) ao contrário. Também é interessante notar aqui que o ${1} A variável permanece dentro do subshell! É passado integralmente.

A seguir, ainda de dentro func3 Função, nós imprimimos a saída. Apesar disto, esta saída não será enviada para a tela, em vez disso, será capturado por nossa chamada de função e, por isso, armazenado dentro do 'global’ REVERSE variável.

Estabelecemos nossa entrada em "abc", Ligar para func3 trabalhe novamente de dentro de uma subcamada, passando o INPUT variável, e atribuir a saída para REVERSE variável. Observe que não há absolutamente nenhuma conexão entre o 'global’ REVERSE variável e local REVERSE variável dentro del script.

Considerando que qualquer variável global, incluindo qualquer REVERTER será passado para a função, assim que uma variável local com o mesmo nome for definida, a variável local será usada. Também podemos tentar ver este outro pequeno script test4.sh:

#!/bin/bash

func3(){
  local REVERSE="$(eco "${1}" | rev)"
  eco "${REVERSE}"
}

INPUT="abc"
REVERSE="teste"
func3 "${ENTRADA}"
eco "${REVERSE}"

Exemplo de função bash e variável local que exemplifica dois dos pontos de aprendizagem vistos até agora

Quando você corre, a saída é cba e test. a cba este tempo é gerado pelo mesmo echo "${REVERSE}" Dentro de func3 Função, mas desta vez é emitido diretamente em vez de capturado no código abaixo, como o func3 "${INPUT}" A função não é chamada de dentro de uma subcamada.

Este script destaca dois pontos de aprendizagem que abordamos anteriormente: em primeiro lugar, naquela, mesmo quando estabelecemos o REVERSE variável a "test" dentro do script antes de chamar o func3 Função – que o local variável REVERSE Assuma o controle e use-o em seu lugar 'global’ 1.

Em segundo lugar, do que o nosso 'global’ REVERSE a variável retém seu valor, embora houvesse um local variável com o mesmo nome usado na função chamada func3.

Final

Como você pode ver, as funções bash, passando variáveis, bem como o uso de variáveis ​​locais e semi-globais tornam a linguagem de script Bash versátil, fácil de codificar e oferece a oportunidade de estabelecer um código bem estruturado.

Além disso, é digno de nota aqui que, enquanto melhora a legibilidade do código e facilidade de uso, usar variáveis ​​locais fornece segurança adicional, uma vez que as variáveis ​​não estarão acessíveis fora do contexto de uma função, etc. Desfrute de variáveis ​​e funções locais enquanto codifica no Bash!!

Se você estiver interessado em aprender mais sobre o Bash, consulte Como analisar nomes de arquivo corretamente no Bash e Usando xargs em combinação com bash -c para criar comandos complexos.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.