Para navegar em pastas, usamos o comando cd
, dessa forma:
cd /usr/local
PS: O terminal do Linux pode ser aberto usando Ctrl Alt T.
Se estiver na pasta desejada, basta digitar o caminho, assim:
cd bin
PS: Não esqueça da primeira barra, caso vá pra outro diretório distante do atual. A barra indica o diretório raiz.
As mesmas dicas valem pra executar programas ou outros arquivos, mas não esqueça da extensão dos mesmos, caso existam, pra rodar executáveis é necessário colocar o ponto. Para abrir o local, é preciso colocar xdg-open
no início e em qualquer comando, também pode ser necessário colocar entre aspas, caso tenha espaços no nome, dessa forma:
./"Nome do Executavel"
No Linux, alguns comandos necessitam do uso de administrador, por isso, dependendo da distro (como o Ubuntu), você acessa ele digitando sudo su
e colocando a senha, ou podemos usar o sudo apenas num comando específico que o exija (tipo sudo nautilus fotos.jpg
). O Debian faz isso usando apenas o su
, pois ele não usa sudo em nada. Quando o terminal está em root, ele está com um #
, enquanto no modo usuário está com um $
.
E também podemos iniciar programas escrevendo o nome dele diretamente (pode ser necessário incluir um ./ antes, tudo junto, sem espaços, para arquivos executáveis, ou o caminho dos mesmos, como por exemplo ./script.sh
, exceto quando estão no PATH), inclusive usando com um parâmetro de inicialização, indiciando o que o programa abrirá, por exemplo:
firefox uol.com.br
gedit /home/administrador/Documentos/Contatos.txt
Se quiser renomear um arquivo, use o comando mv
seguido pelo nome antigo e o nome que o substituirá, dessa forma:
mv "Fotos do dia.jpg" pictures.jpg
Se quiser deletar um arquivo pernamentemente pelo terminal, use o comando rm
, assim:
rm "Fotos do dia.jpg"
Para fazer o mesmo com pastas, usamos rm
com o parâmetro -r
, ou o -rf
que força a exclusão sem perguntar, pra diretórios vazios usamos -d
veja um exemplo:
rm -rf "Nova Pasta"
PS: Cuidado com isso.
Também podemos mover arquivos, usando o comando mv
, seguido pelo caminho pro qual o arquivo será movido, dessa forma:
mv fotos.jpg /home/administrador/
Para copiar, usamos da mesma forma, com o comando cp
, só que o caminho terá que ter o nome informado caso queira copiar com outro nome, dessa forma:
cp fotos.jpg /home/administrador/pictures.jpg
Para mover ou copiar diretórios recursivamente, use o parâmetro -r:
cp -r diretorio /home/administrador/
Tanto o mv quando o cp podem ser usados com o parâmetro -f
que suprime o pedido de substituição, caso exista um arquivo de mesmo nome, e da mesma forma o -i
perguntar se desejamos substituir ele.
PS: A barra tem que ser a /
, senão não vai funcionar. O *
pode ser usado como coringa para vários arquivos em todos os casos (por exemplo, *.txt
afetaria todos os arquivos de texto).
Para ver os diretórios dentro das pastas, use o comando ls
(com o parâmetro -l
podemos ver as permissões, que podem ser alteradas pelo comando chmod
).
Podemos também usar parâmetros no ls, o parâmetro -d
lista só diretórios, e o -a
para arquivos ocultos. Um uso dele seria ls -a
.
Também podemos listar apenas um tipo de extensão de arquivo, por exemplo:
ls *.so
Ou especificar o caminho que queremos verificar, caso não queira ver o conteúdo do diretório atual:
ls /usr/bin
Para voltar um diretório, use o cd com dois pontos na frente, assim:
cd ..
PS: Com um ponto, ele fica no mesmo diretório.
Você pode voltar a raiz do diretório da mesma forma, colocando uma barra após o cd, assim:
cd /
PS: O lado da barra é sempre o mesmo, e minúsculas são diferenciadas.
Para limpar toda a tela do terminal, basta executar o comando clear
.
Para desligar, usamos o comando sudo shutdown -h now
.
Para reiniciar, usamos sudo shutdown -r now
ou sudo reboot
.
Para programar isso, usamos o número em minutos, por exemplo:
sudo shutdown -r 10
Usamos o parâmetro -c
para cancelar qualquer um deles. Para exibir uma mensagem colocamos ela entre aspas. Veja um exemplo:
sudo shutdown -r 10 "Reiniciaremos em 10 Minutos"
Podemos usar o comando history
para visualizar um comando já digitado.
Abra o terminal e digite top
(pode ser também htop
, ps
ou pstree
, mas a exibição é diferente) para exibir os números dos códigos ativos, depois use o comando kill
seguido do código PID do processo, por exemplo:
kill -9 352
Podemos usar o xkill
no terminal (ou clicar Alt F2), que transformará o cursor do mouse num "X", que deverá ser clicado somente no programa travado. Temos também a opção killall
para matar todos os processos de um mesmo tipo.
Podemos também usar killall
e o nome do processo a ser excluído (como por exemplo killall firefox
).
Para procurar e corrigir erros, usamos os comandos nessa ordem:
fdisk -l # (lista as partições)
e2fsck /dev/hdxx -y # (colocar a partição com problema)
Ou use apenas fsck.ext3 /dev/hda1
.
PS: Pode ser necessário desmontar a partição usando o comando umount /dev/hdxx
e depois montar de novo com mount /dev/hdxx
.
Em sistemas 32 bits, podemos forçar o uso de PAE, que permite acessar mais memória, digitando cat /proc/cpuinfo | grep -i pae
, sudo apt-get install linux-generic-pae
e sudo apt-get install linux-headers-generic-pae
.
Se quiser escrever frases na tela do terminal, use o comando echo
pra isso, dessa forma:
echo "Essa é uma frase com acentuação!"
Ou em um arquivo:
echo "Essa é uma frase com acentuação!">>~/Desktop/teste.txt
Para pular uma linha num conteúdo escrito, podemos usar echo>>~/Desktop/teste.txt
.
O echo deve ser usado com aspas.
PS: Usando dois >> ele adicionará uma nova linha no arquivo, caso exista, se usar um só > ele sobrescreverá o arquivo existente.
Para mudar o IP, podemos usar o comando network-manager
com os parâmetros stop
(que libera o endereço IP) e na sequência o start
(que renova o endereço IP), dessa forma:
sudo service network-manager stop
sudo service network-manager start
Podendo também ser assim, em uma interface específica:
sudo ip link set down eth0
sudo ip link set up eth0
Use o sudo /etc/init.d/nscd restart
para modificar e liberar o cachê DNS (pode ser necessário instalar o nscd com apt-get).
Para exibir informações sobre o IP e o endereço MAC, além das interfaces, digite ip addr show
.
PS: Antigamente existia o ifconfig no Linux, mas ele foi descontinuado. Os comandos básicos eram esses:
ifconfig enp2s0 down # Desativa uma interface
ifconfig enp2s0 up # Ativa uma interface
ifconfig -a # Mostra informações detalhadas sobre todas as interfaces
Para conferir o ping (latência) e a conectividade das páginas ou IPs, use simplesmente o comando ping
seguido do site ou IP (use Ctrl Z para interromper). O traceroute
é usado para rastrear a rota de um pacote.
Para descobrir o IP de um site, use o comando host nomedosite.com.br
.
Para descobrir o MTU da interface, use sudo ip link show
.
Para selecionar o tamanho em bytes dos pacotes enviados pelo ping, usamos o -s
seguido do número (por exemplo, ping -s 1500 www.google.com.br
). Para selecionar a quantidade de requisições use o parâmetro -c seguido do número, por exemplo -c 6
Podemos também usar parâmetros no traceroute, como para aumentar a quantidade máxima de saltos com o -m, por exemplo traceroute -m 60 www.google.com.br
.
PS: Tanto no ping quanto no traceroute, pode ser necessário colocar -4
para forçar IPv4 ou -6
para forçar IPv6.
Ainda nos problemas de rede, podemos digitar o comando netstat -a -n -e
para verificar todas as portas abertas e os IP's aos quais elas estão conectadas. Ele foi substituído por ss -all
.
Para vermos o cachê ARP, usamos arp -a
(mas foi substituído por ip neigh show
). Para remover um IP dele, usamos ip neigh del 1.1.1.1 dev enp2s0
(substituir o 1.1.1.1 pelo IP desejado).
Podemos usar ip route
para ver a rota da nossa rede. E também podemos adicionar e remover rotas especificando o IP com ip route add 192.168.0.0/24 via 172.16.0.1 dev enp2s0
(na ordem rede a ser acessada, máscara da mesma com notação CIDR e gateway por qual vai acessar, adicione ao arquivo /etc/network/interfaces
para adicionar de forma permanente) e ip route del 192.168.0.0/24
, respectivamente.
Podemos também utilizar o comando nslookup
assim, para vermos dados sobre o servidor do site:
nslookup -q=ns www.google.com.br
Para administrar os serviços inicializados ou parados, usamos o service
seguido da opção desejada, dessa forma:
sudo service service_name start
sudo service service_name stop
PS: Para ver os serviços usados, utilize o comando service --status-all
.
Para criar um usuário novo com senha, basta digitar isso:
sudo useradd nomedousuario -p senha
PS: Caso queira criar um usuário sem senha, basta omití-la e também o parâmetro -p.
Caso queira adicionar/alterar a senha de um usuário local, digite isso:
sudo passwd nomedousuario
Para dar privilégios de administrador ao usuário criado:
sudo usermod -aG sudo nomedousuario
PS: Em algumas distros, o segundo sudo pode ter que ser substituído por root
.
Para excluir um usuário:
sudo userdel -f nomedousuario
PS: Pode ser necessário especificar a opção -r
para remover o diretório padrão do usuário em home.
Para listar os usuários existentes:
cat /etc/passwd
Agora que vimos alguns comandos do Linux, veja alguns dos comandos mais usados:
cd
- Abre uma pasta.clear
- Limpa a tela.xterm -bg nomedacor -fg nomedacor
- Permite configurar as cores do fundo e da letra do terminal, respectivamente, com nomes em inglês, na sessão utilizada.date
- Mostra a data do sistema (podemos formatar a data e hora com os parâmetros +%d/%m/%y_%H:%M:%S_%w
, onde d é dia, m é mês, y é ano, H é hora, M é minuto, S é segundo e w é o dia da semana.).ls
- Exibe a lista de arquivos (podendo receber como parâmetro *.extensao
, para listar apenas um tipo de arquivo, ou mesmo mais de um).mkdir "pasta"
- Cria uma pasta.free
- Mostra a memória utilizada e livre do sistema (use os parâmetro -k
para ver em KB e -m
para ver em MB.tree
- Mostra a estrutura de pastas graficamente.cat /etc/issue
- Mostra a versão do Linux.echo
- Para escrever na tela, aceita sequências de escape. O echo sem nada pula uma linha.variavel="dados"
- Cria variáveis. As variáveis são utilizadas com um símbolo de cifrão no começo, na forma $variavel
.#
- Para comentários.sleep 60
- Isso pausará o terminal por determinados segundos.xdg-open
- Usada para abrir uma pasta ou site.mv "origem" "destino"
- Para mover arquivos ou diretórios (pode ser necessário especificar -r
), pode ser usado também pra renomear arquivos.cp "origem" "destino"
- Para copiar arquivos ou diretórios (pode ser necessário especificar -r
).&&
- Para "grudar" mais de um comando numa mesma linha. Pode ser usado ;
no lugar.echo "texto">>"arquivo"
- Escreve num arquivo, e não no terminal (por exemplo, echo teste>>$HOME/teste.txt
). Se o arquivo não existir, será criado. Da mesma forma, as setas podem ser utilizadas com funções do echo e outros comandos, por exemplo ls>>arquivo.txt
escreve o conteúdo de ls no arquivo especificado. Usando um >
ele sobreescreve o arquivo caso exista, usando dois >>
ele adiciona o texto no arquivo caso exista.more
- Lê o Arquivo no Terminal (como more $HOME/teste.txt
), pode ser usado cat
no lugar.grep -i palavra arquivo
- Procura as palavras escritas pelo usuário, quando usamos o parâmetro -i ele não diferencia maiúsculas (como grep -i PALAVRA $HOME/teste.txt
). Pode ser usado em conjunto com o ls (e também outros comandos) para procurar nomes ou extensões em arquivos, como ls | grep jpg
.service
- Usado com os comandos start
e stop
para iniciar e parar serviços do Linux.rm
- Para excluir arquivos e conteúdos de pastas (para excluir pastas sem confirmação use rm -r
ou rmdir
).history
- Mostra o histórico de comandos já digitados.shutdown
- Para desligar o computador (com parâmetro -h
) ou reiniciar (parâmetro -r
), pode ser usado now
para desligar imediatamente, ou definido o tempo para a operação com o número, como 10
(em minutos). Para anular qualquer um deles use o parâmetro -c
.e2fsck /dev/hdxx -y
- Para corrigir erros de disco.top
- Mostra os processos ativos no sistema (como alternativa temos o htop
).kill -9 3806
- Mata um processo baseado no seu PID (se quiser usar o nome literal, use killall processo
.ip
- Para configurações de redes, basicamente com link set down eth0
libera o endereço IP e link set up eth0
o renova, e addr show
mostra detalhes completos das interfaces de rede.ping nomeouipdosite.com
- Verifica se há conectividade num host.traceroute nomeouipdosite.com
- Rastreia a rota de um pacote até o host especificado.ss -all
- Verifica quais portas estão abertas e os IPs associados a elas.alias nome="comandos"
- Define um alias temporário para um comando, para excluir ele digite unalias nome
.chmod 644 Arquivo
- Modifica permissões para arquivos usando números octais (4 leitura, 2 gravação e 1 execução, e as somas entre eles), na ordem proprietário, grupo e outros (pode ser usado chmod +x arquivo
para torná-lo executável, e chmod -x arquivo
para retirar isso. Para diretórios e seus arquivos recursivamente, use chmod -R 755 diretorio
pwd
- Mostra o diretório atual.who
- Mostra usuários logados no sistema.df
- Mostra a quantidade de espaço livre no disco rígido (pra ver o usado use du
.stat arquivo
- Mostra o estado de um arquivo, útil para saber por exemplo a hora e data do último acesso ao mesmo.file arquivo
- Exibe as informações de um arquivo especificado.cat /proc/cpuinfo
- Exibe as informações da CPU.cat /proc/meminfo
- Exibe as informações da memória.sudo mkfs.fat /dev/sdb1
- Formata um disco especificado em um formato especificado (no lugar de mkfs.fat pode ser mkfs.ntfs
ou mkfs.exfat
).man
- Exibe o manual de outro comando.hostname
- Retorna o nome do host do computador.exit
- Fecha o Terminal.Caso algum comando não seja encontrado, digite apt-get install nomedocomando
.
Para interromper algum comando sendo executado, dê um Ctrl C. Para ajuda a um comando, digite ele seguido de --help
, como por exemplo ls --help
.
Como coringa, usamos o *, podendo inclusive usar nas extensões, como *.*. E comandos do terminal são case-sensitive.
A variável $?
guarda o status do último comando executado. Se o mesmo foi executado corretamente, ele retornará 0
, se o comando der erro ele retornará outro número diferente de zero (por exemplo, comando não encontrado retorna 127
). Podemos visualizar o conteúdo dessa variável digitando no terminal echo $?
. Esse código também pode ser usado em Shell Script também, como em condicionais e laços de repetição.
PS: Tome cuidado com as fork bombs, que chamam vários processos iguais até travar o sistema. No terminal do Linux, uma fork bomb pode ser assim (quase sempre num arquivo Shell Script):
# Não execute nada desse código:
:(){:|:&};:
Só pra entender, acima é uma função chamada ":" (pode ser qualquer nome) que chama a si mesma em primeiro e segundo plano.
Para criar arquivos BASH, crie um arquivo de texto no Bloco de Notas e salve com a extensão .sh (ou use o vi
no terminal, o touch
ou o echo
com arquivo no terminal), para criar um arquivo de scripts novo, e coloque os comandos dessa forma:
#!/bin/bash
echo "Criação do BASH em Linux Efetuada com Êxito."
echo
echo -n "Pressione qualquer tecla pra continuar..."
read
No código acima, o #!/bin/bash
define o shell especificado para executar ele e o echo sem nada pula uma linha.
Dessa forma, podemos criar arquivos que executem várias funções de uma vez. Todos os comandos do shell funcionam normalmente no BASH, mas alguns caracteres podem não funcionar. Podemos inclusive, usar variáveis e operadores condicionais e de repetição.
Lembrando que para executar um script BASH no Linux, precisamos dar um sudo chmod +x nomedoscript.sh
para rodar ele como executável (caso contrário ele é identificado como texto). Podemos digitar também, sem dar permissão, bash nomedoscript.sh
, mas não é recomendado, a não ser em casos que é impossível dar as tais permissões.
PS: Podemos usar outros shells do Linux, e a extensão .sh é opcional, já que o Linux identifica pelo mimetype, pela declaração de bash e pela permissão de execução, por isso ele pode ter outra extensão ou mesmo não ter nenhuma, mas pra facilitar a identificação, se usa a extensão .sh.
Para utilizar variáveis no shell, apenas usamos o nome dela com a atribuição (tem que estar com o = tudo junto, tipo num=3
). As variáveis são usadas com um cifrão antes delas (tipo $num
), exceto na atribuição. Podemos também atribuir um caminho de pasta à elas, programas ou sites à elas. Veja um exemplo:
pasta=$HOME/Imagens
xdg-open $pasta
exit
PS: Variáveis em shell diferenciam maiúsculas de minúsculas.
Se quiser pedir dados do usuário em variáveis, use o comando read
para ele ser inserido na variável. Para não pular de linha, coloque o parâmetro -n
no echo. Veja um exemplo:
echo -n "Digite seu nome: "
read nome
echo -n "Digite sua idade: "
read idade
ano=$[2018 - $idade]
echo "Olá $nome, você nasceu em $ano."
exit
Podemos também usar o read diretamente, por exemplo:
read -p "Digite seu nome: " nome
read -p "Digite sua idade: " idade
PS: Você pode usar $USER
como um coringa que mostrará o nome do usuário logado no momento.
Essas são as variáveis do sistema (usadas também com $):
Variável | Conteúdo Exibido |
---|---|
HOME | /home/UsuarioAtual |
USER | "UsuarioAtual" |
LOGNAME | "UsuarioAtual" |
PWD | Diretório Atual |
LANG | Idioma Atual |
SHELL | /bin/bash (ou o Shell Atual) |
TERM | Tipo de Terminal Usado |
PATH | Diretórios definidos no Path |
E-mail Definido | |
OSTYPE | Tipo de Sistema Usado |
Como visto no exemplo anterior, é possível fazer operações aritméticas no BASH, normalmente com +, -, * e /, o % funciona normalmente como cálculo de módulo.
Veja um exemplo de uso para operações aritméticas:
read -p "Digite o primeiro número: " num1
read -p "Digite o segundo número: " num2
clear
soma=$[$num1 + $num2]
subs=$[$num1 - $num2]
mult=$[$num1 * $num2]
divi=$[$num1 / $num2]
rest=$[$num1 % $num2]
echo "A soma entre $num1 e $num2 é igual à $soma."
echo "A subtração entre $num1 e $num2 é igual à $subs."
echo "A multiplicação entre $num1 e $num2 é igual à $mult."
echo "A divisão entre $num1 e $num2 é igual à $divi com resto de $rest."
echo
read
Também podemos fazer operações aritméticas sem variáveis, apenas digitando echo seguida da operação, como echo $[10 + 5]
, ele retornará o resultado da conta.
PS: Em alguns shells, a operação deve ser feita com dois parênteses, como por exemplo echo $((10 + 5))
.
Podemos também usar condicionais no shell, usando o if
, o else
e o elif
. Dessa forma:
read -p "Digite um Número: " num
if [ $num -lt 10 ]; then
echo "É menor que 10."
elif [ $num -gt 10 ]; then
echo "É maior que 10."
else
echo "É igual à 10."
fi
PS: Note que precisa ter um espaço entre as variáveis e os valores, dentro dos colchetes. Em arquivos sh pode ser necessário haver tabulação. Caso um condicional if tenha mais de uma opção pra mesma condição, coloque cada uma em colchetes separados, e o operador && ou || entre os colchetes sem espaços.
Veja outro exemplo de shell para criar pastas:
cd $HOME/Desktop
if [ -d teste ]; then
echo "Essa Pasta já Existe."
else
mkdir teste && echo "A Pasta foi Criada."
fi
PS: O &&
é para executarmos mais de um comando na mesma linha. Temos também o elif, que funciona como o else if. Para verificar se um arquivo existe, use o parâmetro -f
, o parâmetro -d
é para verificar se um diretório existe.
Veja algumas opções que podemos usar com números, só lembrando que eq e ne é necessário usar com letras e palavras também:
-eq | Igual |
-ne | Diferente |
-lt | Menor que |
-le | Menor que ou igual |
-gt | Maior que |
-ge | Maior que ou igual |
Veja um exemplo para calcular médias:
read -p "Digite a primeira nota: " n1
read -p "Digite a segunda nota: " n2
# Não esqueça da ordem de precedência:
med=$[($n1 + $n2) / 2]
if [ $med -lt 4 ]; then
sit="Reprovado"
elif [ $med -gt 6 ]; then
sit="Aprovado"
else
sit="Em Recuperação"
fi
clear
echo "A média das notas é $med. $sit!"
Temos também o case, usado dessa forma:
read -p "Digite sua opção: " opc
case $opc in
1)
echo "Opção 1!";;
2)
echo "Opção 2!";;
3)
echo "Opção 3!";;
*)
echo "Opção Inválida!";;
esac
PS: O asterisco seria como o "default" em outras linguagens.
Para criar uma estrutura de repetição em shell, usamos o for
, dessa forma:
for r in $(seq 1 1 44); do
echo "Volta o cão arrependido, com suas orelhas tão fartas, com seu osso roído, e com o rabo entre as patas..."
done
read
O in
passará os números de incremento, com eles entre o cifrão e os parênteses, representando na ordem, o início, incremento e fim do mesmo O do
especifica os comandos a serem executados.
Para fazer o incremento também aparecer no echo, usamos a variável de incremento, dessa forma:
for r in $(seq 1 1 44); do
echo "$r - Volta o cão arrependido, com suas orelhas tão fartas, com seu osso roído, e com o rabo entre as patas..."
done
read
PS: O laço pode ser feito assim, mais parecido com o laço em linguagem C e semelhantes:
for((i = 0; i < 10; i++)); do # Usamos os mesmos operadores lógicos do C e semelhantes
echo $i
done
Veja outro exemplo com um programa que exibe a tabuada de um número:
#!/bin/bash
# Função
tabuada() {
read -p "Digite um número para ver sua tabuada: " num
echo
echo "Tabuada de $num:"
echo
echo "-----------------"
for t in $(seq 1 1 10); do
res=$[$num * $t]
echo "$num x $t = $res"
done
echo "-----------------"
read -p "Deseja digitar outros números? [S/N] " opc
if [ $opc = s ]||[ $opc = S ]; then
clear
tabuada # Recursividade
fi
}
# Chamada da função
tabuada
O while podemos utilizar assim:
cont=0
while [ $cont -le 10 ]; do
echo $cont
cont=$[$cont + 1]
done
Com break e continue:
cont=0
while true; do
cont=$[$cont + 1]
if [ $[$cont % 2] -eq 0 ]; then
continue
elif [ $cont -gt 50 ]; then
break
fi
echo $cont
done
Para criar um array num BASH podemos fazer assim:
vetor=(1 2 3 4)
# O asterisco exibe todos os elementos do array
echo ${vetor[*]}
Podemos também colocar as posições diretamente:
vogais=()
vogais[0]="A"
vogais[1]="E"
vogais[2]="I"
vogais[3]="O"
vogais[4]="U"
for i in ${vogais[*]}; do
echo -n "${i} "
done
echo
Podemos criar funções em BASH, veja um exemplo simples de criação de uma função:
mensagem() {
echo "Introdução à Funções em BASH"
}
mensagem
# Também pode ser assim, com a palavra function e sem parênteses:
# function nomedafuncao {
#
# }
PS: Note que para exibir, não usamos os parênteses, pode se criar funções sem a palavra function, mas ela terá que ter parênteses após o nome indicando que é uma função, sem nada dentro.
Para passarmos parâmetros, não os colocamos dentro dos parênteses, eles são jogados nas variáveis $1, $2, $3, etc. Por exemplo:
multi() {
echo "A multiplicação é $[$1 * $2]"
}
multi 10 5
Exemplo com parâmetro e retorno:
soma() {
return $[$1 + $2]
}
soma 10 5 # Guardará automaticamente na variável $?
echo "A soma é $?"
Só que a forma acima só retorna valores inteiros entre 0 e 255, para simular o retorno com outros tipos de dados e números fora dessa faixa, fazemos assim:
soma() {
echo $[$1 + $2]
}
res=`soma 1000 500`
echo "A soma é $res"
Vários outros comandos úteis podem ser vistos aqui: https://www.devmedia.com.br/comandos-importantes-linux/23893