{"id":27644184,"url":"https://github.com/maiconwte/shell-scripts","last_synced_at":"2026-05-21T07:44:30.576Z","repository":{"id":123506614,"uuid":"275038173","full_name":"maiconwte/shell-scripts","owner":"maiconwte","description":":coffee: An introduction on how to start your shell scripts","archived":false,"fork":false,"pushed_at":"2020-06-26T13:10:58.000Z","size":22,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-15T12:56:06.740Z","etag":null,"topics":["scripts","shell","shell-script","unix","unix-shell"],"latest_commit_sha":null,"homepage":"https://www.maiconsilva.com/shell-scripts/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maiconwte.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-06-25T23:55:42.000Z","updated_at":"2023-03-09T02:13:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"53d50b91-7b98-45af-a1e7-ad89bbab8781","html_url":"https://github.com/maiconwte/shell-scripts","commit_stats":null,"previous_names":["maiconwte/shell-scripts"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiconwte%2Fshell-scripts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiconwte%2Fshell-scripts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiconwte%2Fshell-scripts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maiconwte%2Fshell-scripts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maiconwte","download_url":"https://codeload.github.com/maiconwte/shell-scripts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250536511,"owners_count":21446746,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["scripts","shell","shell-script","unix","unix-shell"],"created_at":"2025-04-24T00:23:52.250Z","updated_at":"2026-05-21T07:44:30.501Z","avatar_url":"https://github.com/maiconwte.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introdução - O que são Shell Scripts?\n\nSão scripts interpretados por algum programa [Shell](https://pt.wikipedia.org/wiki/Shell_script), sendo Shell uma interface de linha de comando (CLI) que permite o usuário acessar serviços do sistema operacional.\n\nNos exemplos desse artigo vamos utilizar o [bash](https://pt.wikipedia.org/wiki/Bash) como interpretador.\n\nO Bash está disponível por padrão nos sistemas operacionais Unix-like como Linux e macOS.\n\n\u003e É recomendável que você tenha algum conhecimento básico do uso da CLI antes de começar a escrever shell scripts.\n\n#### Índice\n\n- [Criando o primeiro script](#criando-o-primeiro-script)\n- [Strings](#strings)\n- [Variáveis](#variáveis)\n- [Matrizes](#matrizes)\n- [Execução shell](#execução-shell)\n- [Entradas do usuário](#entradas-do-usuário)\n- [Operadores de comparação](#operador-de-comparação)\n- [Condições](#condições)\n- [Loops](#loops)\n- [Funções](#funções)\n- [Conclusão](#conclusão)\n- [Agradecimentos](#agradecimento)\n\n## Criando o primeiro script\n\nCrie o arquivo `hello-world`:\n\n```shell\n# touch é o comando usado para criar um arquivo\ntouch hello-world\n```\n\nDentro do arquivo vamos imprimir um texto usando o comando `echo`:\n\n```shell\necho \"Hello, world!\"\n```\n\nAgora, usando a linha de comando, podemos executar nosso script com o interpretador `bash`:\n\n```shell\nbash hello-world\n\n# Output: Hello, world!\n```\n\nPronto, temos nosso primeiro shell script.\n\n### Scripts executáveis\n\nAprendemos a executar um script prefixado de bash, que é o responsável por interpretar os comandos dentro do nosso arquivo, mas se tentarmos simplesmente executar o arquivo pelo nome, ele não será executado.\n\n\u003e  `./` é usado para indicar que arquivo está no diretório atual\n\n```shell\n./hello-world\n\n# Output: bash: ./hello-world: Permissão negada\n```\n\nPara executar um arquivo diretamente, precisaremos alterar as permissões e permitir que o script seja executado pelo usuário. `chmod` é um comando que altera as permissões em um arquivo e `+x` adiciona direitos de execução ao script.\n\n```shell\nchmod +x hello-world\n```\n\nTambém é necessário adicionar o [hashbang (#!)](https://en.wikipedia.org/wiki/Shebang_%28Unix%29) na parte superior do script. No Unix, arquivos com o `hashbang` é interpretado como um executável.\n\nPara confirmar onde o intérprete está localizado:\n\n```shell\nwhich bash\n\n# Output: /usr/bin/bash\n```\n\nEntão adicionamos `#!/bin/bash` no início do script:\n\n```shell\n#!/bin/bash\n\necho \"Hello, world!\"\n```\n\n\u003e Você também pode ver `#!/usr/bin/env bash`, que pode ser usado se você não souber o caminho exato para o bash.\n\nFeito isso, `hello-world` pode ser executado diretamente:\n\n```shell\n./hello-world\n\n# Output: Hello, world!\n```\n\n\u003e Para executar um script bash sem especificar o diretório (usando `./`, por exemplo), você deverá adicionar o diretório do script ao PATH executando `export PATH=$PATH:/path/to/script/directory`. No entanto, isso geralmente não é necessário para scripts pessoais.\n\n## Strings\n\nUma sequência de caracteres simples que no bash não requer aspas, como normalmente vimos em linguagens de programação:\n\n```shell\necho My String\n\n# Output: My String\n```\n\nPara usar aspas em strings é necessário o uso do [escape](https://pt.wikipedia.org/wiki/Caractere_de_escape) `\\`:\n\n```shell\necho I\\'m a string\n\n# Output: I'm a string\n```\n\nTambém podemos envolver a string em aspas duplas ou simples para omitir o uso de `\\`:\n\n```shell\necho \"I'm a string\" # I'm a string\necho 'A simple \"string\" here' # A simple \"string\" here\n```\n\nCom a flag `-e`, o bash iterpretará strings com caracteres de escape, como por exemplo o `\\n` para pular uma linha. Isso requer a string entre aspas:\n\n```shell\necho -e \"This string has a \\nnew line\"\n\n# Output:\n# This string has a\n# new line\n```\n\nAs strings entre aspas duplas também são importantes para uso com variáveis, como veremos na próxima seção.\n\n## Variáveis\n\nPodemos usar variáveis ​​como em qualquer linguagem de programação. Não há tipos de dados. Uma variável no bash pode conter um número, um caractere ou uma sequência de caracteres.\n\nTambém não é necessário declarar a variável, apenas atribuir um valor irá cria-la:\n\n```shell\nSTR=\"Hello, My First Var!\"\n\necho $STR\n\n# Output: Hello, My First Var!\n```\n\n\u003e Nota: Observe que não deve haver espaços entre o sinal de igual e o nome e o valor da variável.\n\nCadeias de caracteres entre aspas duplas são necessárias para interpolar variáveis. Entre aspas simples, o cifrão seria interpretado literalmente:\n\n```shell\nWHO=\"Maicon\"\n\necho 'Hello, $WHO'   # Hello, $WHO\necho \"Hello, $WHO\"   # Hello, Maicon\necho \"Hello, ${WHO}\" # Hello, Maicon\n```\n\nEssa sintaxe é necessária para qualquer coisa mais complexa que  possamos fazer com uma variável, como obter um item de uma matriz, cálculos, condicionais, escopos etc.\n\n## Matrizes\n\nUma matriz no bash é definida entre parênteses e não há virgulas entre seus itens:\n\n```shell\ngames=('TLOU 2', 'God of War', 'Gost of Tushima')\n```\n\nE para acessarmos dados de uma matriz, usa-se colchetes `[]`. As matrizes são indexadas em `0`:\n\n```shell\necho ${games[0]} # TLOU 2\necho ${games[2]} # Gost of Tushima\n```\n\n\u003e Nota: para imprimir ou recuperar dados de matrizes, também é necessário o uso de `{}`.\n\n## Execução shell\n\nPodemos atribuir a saída de um comando em tempo de execução adicionando `$()` em torno do comando. Ex, para atribuir a data atual no formato `dd-mm-yy hh:mm` em um uma variável no nosso script, ficaria `VAR=$(date +\"%d-%m-%y %H:%M\")`:\n\n```shell\nDATE_NOW=$(date +\"%d-%m-%y %H:%M\")\n\necho $DATE_NOW\n\n# Output: 25-06-20 16:50\n```\n\nObserver que o valor de `DATE_NOW` é a saída do nosso comando em `$(COMANDO)`.\n\n## Entrada do usuário\n\nJá vimos como atribuir valores a uma variável via script, mas também podemos solicitar ao usuário esse valor via CLI. Isso é feito pelo comando `read`:\n\n```shell\necho 'Who are you?'\n\nread who\n\necho \"Hello, $who!\"\n\n# Output: Who are you?\n# \u003e Maicon\n# Hello, maicon!\n```\n\n## Operadores de comparação\n\nOs operadores de comparação em scripts bash pode ser um pouco diferente se comparados a linguagens de programação como o JavaScript.\n\nPor exemplo, é diferente quando comparamos números e quando comparamos cadeias de caracteres.\n\nAqui vai uma tabela com alguns exemplos:\n\n| Números | Strings | Descrição |\n| ------------- |:-------------:| -----:|\n| `-eq`   | `==`    | Igual             |\n| `-ne`   | `!=`    | Não igual         |\n| `-gt`   | `\u003e`     | Maior que         |\n| `-ge`   | `\u003e=`    | Maior ou igual    |\n| `-lt`   | `\u003c`     | Menor             |\n| `-le`   | `\u003c=`    | Menor ou igual    |\n\nTámbém é possível usar `-z` para testar o vazio em uma sequência de caracteres.\n\n## Condições - Comandos de seleção ou de tomada de decisão\n\nEm diversos momentos, um script precisa tomar uma ação baseado em alguma condição, um `if else`.\n\nA estrutura condicional de um bash é `if`, `test ou [ CONDICAO ]`, `then`, `else`, e `fi` para finalizar o bloco.\n\nEm `CONDICAO`, é possível utilizar os operadores que vimos na tabela da seção anterior:\n\n```shell\nif [ CONDICAO ];\nthen\n  AÇÕES\nfi\n```\n\n- `CONDICAO`: Avalia a condição passada, se verdadeiro executa a instrução do bloco `then`;\n- `ELSE`: É executado quando [ CONDICAO ] não for verdadeira;\n- `AÇÕES`: Comandos que vão executar dentro do bloco;\n\n\u003e Nota: Para fechar um if é necessário `fi` no final do bloco\n\n\u003e Os colchetes '[ CONDICAO ]' são um atalho para o comando test. também poderia ser escrito \"if test CONDICAO\"\n\nVamos ao exemplo, um script que mostra se a idade passada no console é de uma pessoa maior ou menor de idade:\n\n```shell\n#!/bin/bash\n\necho \"Qual sua idade?\"\n\nread age\n\nif [ $age -gt 17 ]\nthen\n    echo 'Maior de idade'\nelse\n    echo 'Menor de idade'\nfi\n```\n\n### Elif - else if?\n\nEm alguns casos é necessário testar mais de uma condição, todas correlacionadas. Para isso temos o `elif`:\n\n```shell\nif [ CONDICAO_1 ];\nthen\n    AÇÕES_1\nelif [ CONDICAO_2 ];\nthen\n    AÇÕES_2\nelif [ CONDICAO_3 ];\nthen\n    AÇÕES_3\n    .\n    .\n    .\nelif [ CONDICAO_N ];\nthen\n    AÇÕES_N\nfi\n```\nPara ficar mais claro, vamos usar em um exemplo prático.\n\nVamos apresentar um menu para o usuário escolher uma opção. Baseado nesta escolha, a hora e a data serão exibidas; uma divisão será efetuada e seu resultado será exibido, e uma mensagem será exibida com o nome que o usuário fornecer:\n\n```shell\n#!/bin/bash\n\necho \"Selecione uma opção:\"\necho \"1 - Exibir data e hora do sistema\"\necho \"2 - Exibir o resultado da divisão 10/2\"\necho \"3 - Exibir uma mensagem\"\n\nread opcao;\n\nif [ $opcao -eq 1 ]\nthen\n    data=$(date +\"%d-%m-%y %H:%M\")\n    echo \"$data\"\nelif [ $opcao -eq 2 ]\nthen\n    result=$((10/2))\n    echo \"divisao de 10/2 = $result\"\nelif [ $opcao -eq 3 ]\nthen\n    echo \"Qual seu nome?\"\n    read name\n    echo \"Bem-vindo ao shell script, $name\"\nfi\n```\n\n### Case\n\nO comando `case` tem a mesma funcionalidade do `if...then...elif`, com a diferença de sua sintaxe ser mais compacta e enxuta:\n\n```shell\ncase VARIAVEL in\n    CASO_1)\n        AÇÕES_1\n    ;;\n    CASO_2)\n        AÇÕES_2\n    ;;\n    CASO_N)\n        AÇÕES_N\n    ;;\nesac\n```\n\nPara efeitos de comparação, vamos modificar o script visto em `elif` para usar o `case`:\n\n```shell\n#!/bin/bash\n\necho \"Selecione uma opção:\"\necho \"1 - Exibir data e hora do sistema\"\necho \"2 - Exibir o resultado da divisão 10/2\"\necho \"3 - Exibir uma mensagem\"\n\nread opcao\n\ncase $opcao in\n    1)\n        data=$(date +\"%d-%m-%y %H:%M\")\n        echo \"$data\"\n    ;;\n    2)\n        result=$((10/2))\n        echo \"divisao de 10/2 = $result\"\n    ;;\n    3)\n        echo \"Qual seu nome?\"\n        read name\n        echo \"Bem-vindo ao shell script, $name\"\n    ;;\nesac\n```\n\n## Loops\n\nO uso de loops é muito comum quando precisamos iterar sobre um determinado valor até alguma condição seja satisfeita ou que o laço chegue ao fim.\n\nO Bash usa os loops `for`, `while` e `until`.\n\n```shell\nfor VARIAVEL in VALOR_1, VALOR_2 … VALOR_N;\n    do\n        AÇÕES\n    done\n```\n\n- `VARIAVEL`: Variável cujo valor será inicializado e incrementado, respeitando os limites dos valores do conjunto fornecido;\n- `VALOR_1, VALOR_2, VALOR_N`: valores que `VARIAVEL` poderá assumir durante o `loop`;\n- `AÇÕES`: Ações a serem tomadas dentro do `loop`.\n\n\u003e Nota: A sequência `VALOR_1, VALOR_2, VALOR_N` pode ser substituida por `{VALOR_1..VALOR_N}`.\n\nPor exemplo, podemos utilizar o `for..in` para listar todas as pastas em algum diretório do sistema:\n\n```shell\necho -e \"Testando a listagem de pastas\"\n\nfiles=~/folder/subfolder/*\n\nfor file in $files\ndo\n  echo $(basename $file)\ndone\n```\n\nA saída do script é o nome de cada pasta presente no diretório informado em `files`.\n\n### While\n\nUm outro exemplo bem comum é o uso do `while..do`, que executa uma ação até que a condição de saída seja atendida:\n\n```shell\necho \"Informe o que você quiser, -1 para sair\"\n\nread dado;\n\nwhile [ $dado != \"-1\" ];\n    do\n        echo “Você digitou $dado”\n    read dado;\ndone\n```\n\nO bloco `do` será executado enquanto o valor imputado pelo usuário for diferente de `-1`.\n\n## Funções\n\nFunções são usadas para organizar estruturas lógicas, e no shell script não é diferente.\n\nPara criar uma função é bem simples, basta:\n\n```shell\nnome_funcao() {\n    AÇÕES\n}\n```\n\nUm exemplo bem básico onde o usuário pode optar por qual função chamar:\n\n```shell\n#!/bin/bash\n\nmain() {\n    echo \"Escolha uma opção:\"\n    echo \"1 - Printar nome\"\n    echo \"2 - Printar idade\"\n\n    read opcao\n\n    case $opcao in\n    \"1\")\n        print_name\n    ;;\n    \"2\")\n        print_age\n    ;;\n    esac\n}\n\nprint_name() {\n    echo \"Qual seu nome?\"\n\n    read name\n\n    echo \"Seu nome é $name\"\n}\n\nprint_age() {\n    echo \"Qual sua idade?\"\n\n    read age\n\n    echo \"Sua idade é $age\"\n}\n\nmain\n```\n\n\u003e Nota: Lembre-se sempre de chamar a função principal (no nosso caso, main) no final do script, do contrário, nada acontecerá quando o script for executado.\n\n### Argumentos\n\nArgumentos são muito comuns como dados de entrada em um programa.\n\nO shell script tem alguns nomes especiais para argumentos recebidos por um script:\n\n- `$0`: Contém o nome do script que foi executado;\n- `$1 --- $n`: Contém os argumentos na ordem em que foram passados (1º argumento em $1, 2º argumento em $2, etc.).\n- `$#`: Contém o número de argumentos que foi passado (ou seja, não considera o nome do script em $0);\n- `$*`: Retorna todos os argumentos de uma única vez.\n\nPor exemplo:\n\n```shell\n#!/bin/bash\n\nif [ $# -lt 1 ];\nthen\n  echo \"Precisa fornecer pelo menos 1 argumento!\"\n  exit 1\nfi\n\necho \"Número de argumentos passados: $#\"\n\ni=0\n\nfor argumento in $*\n  do\n    i=$(($i+1))\n    echo \"Argumento $i passado: $argumento\"\ndone\n```\n\nO script acima pede que pelo menos um argumento seja passado:\n\n```shell\nbash arguments Maicon\n\n# Output:\n# Número de argumentos passados: 1\n# Argumento 1 passado: Maicon\n```\n\n## Conclusão\n\nNesse artigo vimos o necessário para criar e executar um shell script. Com isso já é possível começar a criar scripts mais avançados para automatizar tarefas, rotinas etc.\n\nCom shell scripts podemos instalar programas, realizar backups, executar tarefas etc. Aqui tem uma infinidade de possibilidades.\n\nUm caso de uso bem legal é criar um script para preparar seu ambiente, e não ter que ficar instalando e configurando a máquina sempre que precisar formatar.\n\n## Agradecimentos\n\n- https://www.taniarascia.com/how-to-create-and-use-bash-scripts/\n- https://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-5.html\n- https://en.wikipedia.org/wiki/Shebang_%28Unix%29\n- https://www.devmedia.com.br/introducao-ao-shell-script-no-linux/25778\n- https://pt.wikipedia.org/wiki/Bash\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaiconwte%2Fshell-scripts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaiconwte%2Fshell-scripts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaiconwte%2Fshell-scripts/lists"}