Se você está apenas começando a criar scripts Bash, muitas vezes poderá repetir os mesmos comandos repetidamente em seus scripts, mas existe uma maneira melhor. Explicarei o que significa “DRY” e como você deve usar funções para fazer isso.
Quando escrevi meu primeiro programa no Windows, era um script em lote. Basicamente, eu improvisei e, com um mínimo de compreensão, escrevi um conjunto de instruções muito literal, salpicado de instruções GOTO e me repeti o suficiente para tornar o script ilegível.
Na programação, DRY significa “não se repita”. As funções são o mecanismo para conseguir isso e vou mostrar como.
HTG Wrapped 2025: 24 dias de tecnologia
24 dias de nossos hardwares, gadgets e tecnologia favoritos
Uma introdução às funções Bash
Sou um aprendiz visual e acredito que ajuda ver o assunto antes dos detalhes técnicos. Então aqui está uma função:
foo() { echo "Hello, World!" }“foo” é o nome da função e é como a invocamos (chamamos):
foo fooObserve que chamamos a função duas vezes? Esta é a natureza deles: trechos reutilizáveis para tornar nosso código “SECO”.
Também podemos usar a palavra-chave “function” para defini-los, mas isso significa que não podemos usar o script em outros shells:
function foo () { echo "Hello, World!" }Seguindo em frente. Um exemplo mais realista é agrupar um comando útil:
backup() { cp "foo.txt" "foo.txt.backup-$(date +%Y%m%d)" }Esta função faz um backup de um arquivo chamado “foo.txt” simplesmente anexando “backup” e uma data ao nome do arquivo. Tornaremos a função reutilizável na próxima seção.
As funções podem ser muito maiores, abrangendo várias linhas. Pense neles como mini scripts ou comandos reutilizáveis.
Passando argumentos para uma função
As funções não são muito úteis, a menos que você possa passar valores para elas, e nós podemos — elas são chamadas de parâmetros ou argumentos.
A distinção entre esses termos é menor. Vou chamá-los de argumentos, mas o manual do Bash pode chamá-los de parâmetros.
Novamente, um exemplo é melhor inicial:
foo() { echo "${1}" "${2}" }Os “${1}” e “${2}” são o primeiro e o segundo argumentos, respectivamente. Você os passa para “foo” como:
foo "Hello, " "World!" foo "Hello, " "Universe!"Coloque “aspas” em torno das palavras para definir seus limites. Observe que “Olá” também inclui uma vírgula e um espaço? Usar citações dessa forma deixa seus limites claros para o Bash.
Eles são chamados de strings, e tenho um artigo mais avançado que aborda como alterar strings de maneira simples.
Enfim, de volta às funções. “${1}” e “${2}” são chamados de parâmetros posicionais na linguagem Bash (ou seja, parâmetros com posições). Existem diversas maneiras de acessar argumentos; alguns são mais avançados, mas “${1}” e “${2}” são suficientes para iniciantes.
Vamos usar argumentos em um exemplo real:
backup() { cp "${1}" "${1}.backup-$(date +%Y%m%d)" }Isso melhora nossa função anterior de “backup”. Leva apenas um parâmetro: o nome do arquivo (ou caminho). Agora a função fará backup de qualquer arquivo que você desejar, o que o torna mais seco que o Deserto do Saara.
Ao colocar “${1}” entre aspas duplas, permite ao Bash substituí-lo (expandi-lo) pelo valor atribuído. As aspas simples funcionam de maneira diferente e fazem com que a string se torne literal:
backup() { echo '${1}' '${1}.backup-$(date +%Y%m%d)' } backup "foo.txt"Alterei “cp” para “echo” para que você possa ver como é o argumento “${1}”. Não é mais uma variável, mas um valor literal: exatamente como você especificou. Mais sobre variáveis abaixo.
Há mais um pequeno conceito que quero apresentar, que tornará seu código mais legível (extremamente importante):
backup() { local file_path="${1}" cp "$file_path" "$file_path.backup-$(date +%Y%m%d)" }“local file_path=${1}” é chamado de atribuição de variável. Uma variável é um local de armazenamento para um valor. Criamos uma variável chamada “file_path” e armazenamos “${1}” (o argumento da função) nela. Agora “file_path” é igual a “${1}”, e nós o usamos em nosso comando.
Use nomes de variáveis desta forma para descrever qual é o argumento. Seu eu futuro agradecerá porque você pode entender isso rapidamente.
Retornando valores de uma função
Retornar valores de funções Bash é um pouco diferente de outras linguagens. No Bash, só podemos retornar um código de saída, que é um número que indica o status de sucesso de um comando. Por exemplo:
foo() { return 0 } foo && echo "success"O “&&” irá “ecoar” “sucesso” somente se “foo” tiver um código de saída bem-sucedido (“0”).
Vejamos um código de saída malsucedido (ou seja, o comando falhou):
foo() { return 1 # Non-zero means unsuccessful. } foo && echo "success" # Doesn't echo "success".Resumindo, o valor de retorno de uma função Bash é apenas para códigos de saída.
Seguindo em frente. Vamos obter um valor útil de uma função.
No Bash, cada saída é essencialmente uma string. Quando um comando imprime um resultado (número ou texto), é uma string. Pense nas saídas do Bash como mensagens: você pede a um comando para fazer algo e ele diz uma mensagem. Quando queremos retornar um valor de uma função, imprimimos uma mensagem com “echo”:
foo() { echo "Hello, World!" }Se o comando (por exemplo, “echo”) falhar, a função retornará implicitamente seu código de saída – mas retornará um código de saída personalizado conforme desejado.
foo() { echo "Hello, World!" return 0 }Vamos fazer algo com nosso resultado, como faríamos com qualquer outro comando:
foo() { echo "Hello, World!" return 0 # This won't be processed by "tr". } foo | tr '[[:lower:]]' '[[:upper:]]'“tr” substituirá “Olá, mundo!” ecoado de “foo” com uma string maiúscula. Isso demonstra que podemos usar “echo” para retornar um valor e operar nele como qualquer outro comando.
Para esclarecer, podemos operar diretamente nas saídas de qualquer comando:
foo() { echo "Hello, World!" | tr '[[:lower:]]' '[[:upper:]]' } foo | sed 's/WORLD/UNIVERSE/' Aqui a função ecoa “Hello, World!”, cujo “tr” transforma em letras maiúsculas. Fora da função, canalizamos o resultado para “sed” e substituímos “WORLD” por “UNIVERSE”.
3 técnicas de script Bash que todo usuário Linux deve conhecer
Desbloqueie o poder do Bash com estas técnicas simples.
As funções Bash são essencialmente wrappers reutilizáveis em torno de comandos. Você pode usá-los para definir pipelines de comando complexos ou para realizar algum trabalho detalhado e ecoar o resultado. Eles aceitam argumentos e fornecem códigos de saída, assim como os comandos.
Você usará com mais frequência funções Bash para facilitar a vida do seu shell; em vez de digitar pipelines de comandos complexos, crie uma função e injete argumentos. Você os colocaria em seu arquivo bashrc, o que os disponibilizaria em seu shell, como qualquer outro comando. Alternativamente, você pode usá-los dentro de um script no seu PATH.
Como obter uma folha de dicas para qualquer comando no terminal Linux
Às vezes, trapacear é necessário.