{"id":17052583,"url":"https://github.com/cuchi/learn-shell-script","last_synced_at":"2025-06-13T09:09:29.554Z","repository":{"id":84178613,"uuid":"101522806","full_name":"cuchi/learn-shell-script","owner":"cuchi","description":"Material para minicurso de Shell Script (em português)","archived":false,"fork":false,"pushed_at":"2017-09-12T11:17:38.000Z","size":1158,"stargazers_count":7,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-13T09:09:28.341Z","etag":null,"topics":["bash","shell"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cuchi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2017-08-27T01:26:12.000Z","updated_at":"2023-09-06T12:07:47.000Z","dependencies_parsed_at":"2023-03-12T21:57:41.375Z","dependency_job_id":null,"html_url":"https://github.com/cuchi/learn-shell-script","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cuchi/learn-shell-script","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuchi%2Flearn-shell-script","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuchi%2Flearn-shell-script/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuchi%2Flearn-shell-script/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuchi%2Flearn-shell-script/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cuchi","download_url":"https://codeload.github.com/cuchi/learn-shell-script/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuchi%2Flearn-shell-script/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259616383,"owners_count":22884884,"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":["bash","shell"],"created_at":"2024-10-14T10:09:50.157Z","updated_at":"2025-06-13T09:09:29.547Z","avatar_url":"https://github.com/cuchi.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Minicurso de Shell Script\n![Creative Commons Attribution 4.0 International Public License](https://licensebuttons.net/l/by/4.0/80x15.png)\n\n## O que é um Shell?\nO shell é uma das ferramentas mais básicas de um sistema operacional. Ele é\nresponsável por interpretar comandos e acessar recursos como diretórios,\narquivos, executáveis e processos.\n\nO shell não é um software em específico, existem várias implementações\ndiferentes com funcionalidades distintas.\n\nEm sistemas derivados do Unix, o *sh* e o *bash* são os shells mais\nutilizados. Há também outras implementações menos conhecidas e mais específicas,\ncomo *zsh*, *fish*, *ksh*, *csh* e *tcsh*. Todos estes podem ser generalizados\npelo termo **Unix Shells**.\n\nNeste curso, o shell utilizado será o **bash**, pelo motivo de estar disponível\nna maioria das plataformas ([inclusive no Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about)).\n\n## O que é o Shell Script?\nDa mesma maneira que o shell pode interpretar comandos que o usuário digita\ninterativamente no terminal, é possível desenvolver scripts para realizar\ntarefas mais complexas, esses scripts acabamos chamando de **scripts em shell**.\nComo qualquer outra linguagem de programação, o shell definirá como os comandos,\nfunções, operadores, fluxo de execução e variáveis irão se comportar.\n\n## Acessando o Shell\nNo Ubuntu, o shell pode ser acessado abrindo o Terminal.\n* **Importante!** - É comum confundir **shell** com o **terminal**, porém são\nduas aplicações completamente distintas. O **terminal** em si serve apenas para\nrenderizar a saída de texto que é produzida pelo shell ou qualquer software que\nexecute nele.\n\nAo acessar o shell nos deparamos com a mensagem de _prompt_, que precede o campo\npara entrar com os comandos:\n\n![prompt](https://i.imgur.com/H53X4VF.png)\n\n## Comandos\nO shell faz o trabalho de mapear e disponibilizar os comandos disponíveis do\nsistema operacional, estes comandos podem ser:\n* Aplicações executáveis (mapeadas pela variável de ambiente `PATH`, que veremos a seguir)\n* Funções internas do shell (_builtins_)\n* Funções criadas pelo usuário\n* _Aliases_\n* _Keywords_\n\nPara verificar se um determinado comando existe e pra ver o tipo dele, utilize o\ncomando `type`:\n\n```\nuser@debian:~$ type echo\necho is a shell builtin\n\nuser@debian:~$ type man\nman is /usr/bin/man\n\nuser@debian:~$ type type\ntype is a shell builtin\n```\nNo exemplo acima, `man` é um binário executável que está no diretório\n`/usr/bin`, enquanto `type` e `echo` são funções _builtins_ do shell.\n\n### Comandos básicos\nOs comandos a seguir estão presentes em qualquer sistema derivado do Unix, com\neles é possível interagir e navegar entre arquivos e diretórios e ter acesso a\ninformações básicas:\n\n| Comando    | Descrição                                        |\n| ---------- | -------------------------------------------------|\n| `ls`       | Lista o conteúdo do diretório atual              |\n| `cd`       | Navega entre diretórios                          |\n| `mkdir`    | Cria diretórios                                  |\n| `cp`       | Copia arquivos e diretórios                      |\n| `rm`       | Remove arquivos e diretórios                     |\n| `mv`       | Move arquivos e diretórios                       |\n| `cat`      | Mostra o conteúdo de arquivos                    |\n| `pwd`      | Mostra o caminho do diretório atual              |\n| `echo`     | Imprime mensagem de texto                        |\n| `whoami`   | Mostra o nome do usuário atual                   |\n| `uname`    | Mostra informações do sistema operacional        |\n| `man`      | Mostra o manual de referência de comandos e APIs |\n\nTodos os comandos podem possuir **parâmetros** e **modificadores**, como por\nexemplo, o comando `ls`:\n\n```\nuser@debian:~$ ls\nDesktop  Downloads\n\nuser@debian:~$ ls -l\ndrwxr-xr-x 2 user user 4096 Sep 10 17:59 Desktop\ndrwxr-xr-x 2 user user 4096 Sep 10 17:59 Downloads\n\nuser@debian:~$ ls -la\ndrwx------ 4 user user 4096 Sep 10 17:59 .\ndrwxr-xr-x 5 root root 4096 Sep 10 17:58 ..\n-rw-r--r-- 1 user user   21 Feb 14  2017 .bash_logout\n-rw-r--r-- 1 user user   57 Feb 14  2017 .bash_profile\n-rw-r--r-- 1 user user  141 Feb 14  2017 .bashrc\ndrwxr-xr-x 2 user user 4096 Sep 10 17:59 Desktop\ndrwxr-xr-x 2 user user 4096 Sep 10 17:59 Downloads\n\nuser@debian:~$ ls Downloads\nlearn-shell-script.zip\n```\n\nNo exemplo acima o comando `ls` é chamado com dois modificadores diferentes, o\n`l` e o `a`, nota-se que também é possível passar um diretório como\nparâmetro.\n* Dica: Veja o manual de referência do comando `ls` para descobrir a\nfinalidade dos modificadores (`-l` e `-a`) utilizados acima.\n\n## Variáveis\nAssim como linguagens imperativas, o shell também oferece variáveis, que podem\nser atribuídas e usadas da seguinte maneira:\n\n```\nuser@debian:~$ assunto=\"shell script\"\n\nuser@debian:~$ echo \"Olá, vamos falar de $assunto?\"\nOlá, vamos falar de shell script?\n```\n\n* Note que não podem haver espaços antes ou depois do operador de atribuição (`=`), caso\ncontrário o shell interpretaria `assunto` como um comando, o que não é o que\ndesejamos.\n\nTambém é bastante útil atribuir a saída de comandos a variáveis:\n\n```\nuser@debian:~$ hoje=$(date +%d/%m/%Y)\n\nuser@debian:~$ agora=`date +%H:%M`\n\nuser@debian:~$ echo \"Olá, agora são $agora horas do dia $hoje.\"\nOlá, agora são 10:12 horas do dia 11/09/2017.\n```\n\nAs duas maneiras acima, utilizando `` ` ` `` e `$()` são equivalentes.\n\n### Variáveis de Ambiente\nNo shell, há um conjunto de variáveis pré-definidas que são responsáveis por\npassar informações relevantes a programas executados por ele. Essas variáveis\npodem ser visualizadas com o comando `env`.\n\nA definição das variáveis de ambiente dependem de quais arquivos são carregados\ncom a inicialização do shell. No **bash** [isso é um pouco complicado](https://askubuntu.com/a/463479),\nmas se você quiser modificar ou criar uma nova variável de ambiente a nível de\nusuário, provavelmente você irá querer modificar os arquivos `.profile` ou\n`.bashrc`.\n\nHá também variáveis especiais, como por exemplo o `$RANDOM`, que retorna um\nnúmero aleatório a cada chamada, o `$?`, que guarda o código de saída do último\ncomando e o `$$`, que guarda o ID de processo do shell.\n\n## Redirecionamento de IO\n### `stdin`, `stdout` e `stderr`\nChamamos de `stdin` a entrada padrão de dados de um processo.\n\nChamamos de `stdout` e `stderr` todo o texto que o processo imprime de volta\npara o shell. A diferença desses dois canais é que o `stderr` é\nconvencionalmente utilizado para imprimir erros.\n\n### Operadores\nO redirecionamento de entrada e saída dos comandos é uma funcionalidade bastante\nútil do shell script, com ela é possível manipular o fluxo da informação de uma\nmaneira fácil.\n\nOs operadores que iremos utilizar são:\n\n| Operador   | Descrição                                               |\n| ---------- | --------------------------------------------------------|\n| `\u003e`        | Redirecionar `stdout` para arquivo (sobrescrever)       |\n| `\u003e\u003e`       | Redirecionar `stdout` para arquivo (inserir no final)   |\n| `\\|`       | Redirecionar `stdout` como `stdin` do próximo comando   |\n| `\u003c`        | Redirecionar o arquivo com `stdin` para o comando       |\n| `2\u003e`       | Redirecionar `stderr` para arquivo (sobrescrever)       |\n| `2\u003e\u003e`      | Redirecionar `stderr` para arquivo (inserir no final)   |\n| `2\u003e\u00261\\|`   | Redirecionar `stderr` como `stdin` do próximo comando   |\n\nA linha abaixo escreve no arquivo `processos.txt` a tabela atual de processos:\n```\nuser@debian:~$ ps -aux \u003e processos.txt\n```\nSe o arquivo não existir, ele será automaticamente criado no diretório atual. Se existir, seu\nconteúdo será substituído pela saída do comando.\n\nVamos supor que esse arquivo será utilizado para algo importante, nesse caso,\npodemos anotar a data no final dele para informar quando o conteúdo foi\nextraído:\n```\nuser@debian:~$ echo \"Tabela extraída em $(date)\" \u003e\u003e processos.txt\n```\n\nVamos supor também que você quer enviar esse arquivo por e-mail, isso é\npossível com:\n```\nuser@debian:~$ mail -s \"Processos\" email@domain.com \u003c processos.txt\n```\n\nPara o operador de pipe `|`, podemos utilizar o seguinte exemplo, supondo\nque o arquivo `lista_de_compras.txt` seja uma lista com um tamanho considerável:\n```\nuser@debian:~$ cat lista_de_compras.txt\nAbacaxi\nArroz\nBanana\nCouve\n...\n\nuser@debian:~$ cat lista_de_compras.txt | shuf | head -n 3\nPão\nLeite\nOvo\n\nuser@debian:~$ cat lista_de_compras.txt | shuf | head -n 3\nArroz\nIogurte\nMaçã\n```\nO que acontece acima? Neste exemplo podemos ver que 3 comandos são chamados, mas\no que eles fazem, em qual ordem?\n\nPara ter uma ideia, procure saber o que os comandos `shuf` e `head` fazem, você\npode consultar com o comando `man`.\n\nExperimente criar sua própria lista e testar o operador `|` (pipe) com ambos os comandos separadamente\npara ver o que acontece:\n```\nuser@debian:~$ cat lista.txt | shuf\n...\n\nuser@debian:~$ cat lista.txt | head -n 3\n...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuchi%2Flearn-shell-script","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcuchi%2Flearn-shell-script","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuchi%2Flearn-shell-script/lists"}