Variáveis:
| Variável | Descrição |
|---|---|
| $? | Recebe última saída recebida |
| $$ | Descrever |
| !! | Exibe o último comando |
| $_ | Pega último parâmetro passado |
| $* | Todas as expansões unificadas |
| $@ | Todas as expansões |
| $0 | Exibe shell atual |
| $BASHPID | Exibe o ID do bash |
| $BASHREMATCH | Retorna o último padrão criado |
| $CDPATH | |
| $PIPESTATUS[@] | |
| $PROMPT_COMMAND | Executa o conteúdo antes de devolver ao prompt |
| $RANDOM | Gera número aleatório $((RANDOM%6+1)) dado |
| $REPLY | Conteúdo do último campo válido |
| $OLDPWD | Último diretório visitado echo ~- mesmo resultado ~+ igual PWD |
| $SHLVL | Exibe a atual instância do shell |
Comparar se está ou não em um subshell:
$$ vs $BASHPIDRepete o mesmo comando anterior do usuário:
sudo !!Cria um arquivo novo ou excluí o conteúdo de um existente:
ls >teste.txtRecebe conteúdo de um arquivo:
text=$(<file.txt)Adiciona texto no início da linha do arquivo:
echo "$(echo Meu texto; cat file)" > file
text=$(cat - nums <<< 'I P'); echo "$text" > nums
echo I P | cat /dev/stdin -
cat - nums <<< 'I P' | tee nums
sed -i '1i I P' nums
echo "$(cat - nums <<< 'I P')" > numsDiretório de execução:
script_dir=${0%/*}Arquivo e formato:
name="${file%.*}"
format="${file##*.}"Verifica se programa existe:
type firefox
type -p firefox
command -v firefox
echo $?Opções bash:
shopt -s extglob # Ativa
shopt -u globasciiranges # DesativaAdicionaconteúdo em algum arquivo existente:
ls >>teste.txtRedirecionamento:
teste < arquivo
cat << eof
teste
eof
grep 'teste' <<< 'teste'Pesquisar uma palavra em diversos arquivos:
grep -r 'palavra' dirExecuta o segundo enquanto o primeiro ainda está em execução:
comando1 & comando2Executa o segundo comando caso o primeiro seja ok:
comando1 && comando2Pasta atual current dir:
cwd=$(dirname "$0")Repete var:
echo ${var}{,}
vida vida
echo ${var}{,,,}
vida vida vida vidaInicia variável:
: "${var:=Iniciada}"Executa o segundo caso o primeiro falhe:
comando1 || comando2Expandi variável:
var="banana laranja"
ctrl+alt+e = expandi as variáveis no terminalExecuta o segundo sem está em uma nova linha:
comando1; comando2Recebe argumento de entrada:
local entrada1=$1
local entrada2=$2Recebe valor de entrada:
read -rp "Digite um valor: " nome_varTesta saída do comando:
if ls; then
echo "comando executado com sucesso"
else
echo "comando terminado com falha"
fiOculta qualquer tipo de erro:
comando &>/dev/nullDescobrir variável PS1:
printf "%q\n" "$PS1"Alinhamento com print:
printf "%9s:\n" "$file"
# teste:
# mais teste:
printf "%-9s:\n" "$file"
# teste :
# mais teste:Parâmetros expansão:
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9Repetindo parâmetros:
echo {left,right}{,}
echo go_to {left,right,up,down}{,,,}Tranca a saída de erro, mais rápido que /dev/null:
ls -la 2>&-Exemplo imagem do kernel:
url='https://www.kernel.org'
while read; do
wget -O /tmp/${REPLY##*/} "$url/$REPLY"
done < <(wget -qO- "$url"|grep -oP 'src="\K.*(png|jpg)(?=")')Declara variáveis inteiras:
declare -i a+=b
let a+=bRenomear múltiplas extenções:
for file in *.json; do
mv "$file" "${file%.json}.yml"
doneReceber resultado do grap em array:
readarray ids <<< $(grep -Eo '<Id>[[:digit:]]*</Id> file.xml)Algumas vezes fica com um espaço a mais, para solucionar use o argumento -t: readarray -t components_files <<< "$(ls ${components_dir}/*.html)"
Somar valor em xml:
sed -E "s|<Id>([[:digit:]])*)echo "</Id>|<Id>$((\1 + 2))</Id>"|geRename pattern:
for file in pattern*;
do mv "$file" "${file//*_/}";
doneDebug:
set -x
...code debug...
set +xAlinhando texto:
column -t arq.csvExibe arquivo formatado com 60 colunas:
fold -sw 60 arq.txtCurl install:
curl -sSL https://get.docker.com/ | sh
sh -c "$(curl -sSL https://get.docker.com/)"App exist:
if type firefox2 >& /dev/null; then
echo Firefox existe
else
echo Firefox não existe
fiIr para a parte final do arquivo:
less +F arqExibe texto com marcas de nova linha:
cat -etConverter PascalCase para kebab-case:
Modo 1:
sed -E 's/([A-Z])/-\1/2g' <<< 'PalavraCruzadaAlinhada' | tr [[:upper:]] [[:lower:]]Modo 2:
converter_para_hifen() {
local palavra="$1"
palavra_convertida="${palavra//[A-Z]/-&}"
palavra_convertida="${palavra_convertida,,}"
palavra_convertida="${palavra_convertida#-}"
echo "$palavra_convertida"
}
entrada="$1"
saida=$(converter_para_hifen "$entrada")
echo "$saida"Modo 3:
foo="TestPascalCaseString"
while [[ "$foo" =~ (.*[a-z0-9])([A-Z].*) ]] && foo="${BASH_REMATCH[1]}-${BASH_REMATCH[2]}"; do
: # do nothing
done
echo "${foo,,}"Exemplo exercício:
grep -E -A1 '^(Country|City|Bairro)$' <<< "$var" | paste - - | awk '{print $1 "\t-\t" $2}'Comando date sem utilitário:
printf '%(%d/%m/%y)T'Nunca usei:
# Remove espaços e caracteres acentuados do nome do arquivo
new_name=$(echo "$file" | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g' | iconv -f utf8 -t ascii//TRANSLIT)Remover todos os arquivos de uma determinada extensão:
find . -name "*.psd" -delete
fd -e psd -x rm {}Head Tail:
head 4 <<< $(file.md)
head -n4 <<< $(file.md)
tail 4 <<< $(file.md)
tail -n4 <<< $(file.md)Ytdlp download playlist:
yt-dlp -x --audio-format mp3 "URL_DA_PLAYLIST"Check exa:
if hash exa 2>/dev/null; then
alias ls='exa'
alias l='exa -l --all --group-directories-first --git'
alias ll='exa -l --all --all --group-directories-first --git'
alias lt='exa -T --git-ignore --level=2 --group-directories-first'
alias llt='exa -lT --git-ignore --level=2 --group-directories-first'
alias lT='exa -T --git-ignore --level=4 --group-directories-first'
else
alias l='ls -lah'
alias ll='ls -alF'
alias la='ls -A'
fiList recent files:
ls ** -t | headMove to current dir:
mv <path> .Edit file with sudo, with current config:
sudoedit <file>
sudo -Es nvim <file>Size of files:
ls -sh | sort -hrShow size of dirs:
du -h --max-depth=1 | sort -hr
ncduWriting lists:
declare -c profs=(julio rubens)
echo ${profs[@]}
Julio RubensList recursive files with path:
ls -R | grep png | xargs realpthShow cr ms:
cat -A file.dos
# Solver ^M$
tr -d '\r' < file.dos | cat -etEfeito de digitação:
content='Esse é um texto'; delay=0.01
for((i = 0; i < ${#content}; i++)); do
echo -n "${content:$i:1}"
sleep $delay
doneRemove espaços em branco:
tr -d '[[:space:]]'Remove caracteres repetidos:
filename=${filename//+(-)/-} # Need enable shopt -s extglob
filename=$(sed -E 's/-+/-/g' <<< "$filename")
filename=$(tr -s '-' <<< "$filename")Remover parte do texto:
cut -c-3 <file>
# xxx-texto
cut -c3- <file>
# texto-xxxLer QRCode:
zbarimg qr.pngGerar QRCode:
qrencode "Text" -o qr.pngRemover caracteres repetidos:
# teste---mago -> teste-mago
echo "${var//+(-)/-}"| Opção | Descrição |
|---|---|
autocd |
Permite mudar de diretório digitando apenas o nome do diretório (sem o comando cd). |
cdspell |
Corrige automaticamente erros de digitação no comando cd. |
checkhash |
Verifica se os comandos no hash table ainda existem ao serem chamados. |
checkjobs |
Avisa sobre jobs em execução ou parados ao sair do shell. |
checkwinsize |
Atualiza as variáveis LINES e COLUMNS após o redimensionamento do terminal. |
cmdhist |
Combina comandos multiline em uma única entrada no histórico. |
dotglob |
Inclui arquivos/diretórios ocultos nos padrões glob (ex.: *). |
expand_aliases |
Expande aliases definidos antes da execução de comandos não-interativos. |
extdebug |
Habilita recursos adicionais para depuração de scripts. |
extglob |
Habilita padrões glob estendidos como `@(foo |
failglob |
Faz com que padrões glob não correspondentes gerem erro em vez de retornar vazio. |
force_fignore |
Força o uso de exclusão com a variável FIGNORE no auto-completar. |
histappend |
Adiciona comandos ao histórico em vez de sobrescrevê-lo ao encerrar o shell. |
hostcomplete |
Habilita a conclusão de nomes de host no auto-completar. |
huponexit |
Envia SIGHUP para jobs ao sair do shell. |
lithist |
Salva comandos multiline com quebras de linha no histórico. |
nocaseglob |
Faz com que os padrões glob ignorem diferença de maiúsculas/minúsculas. |
nocasematch |
Faz com que comparações de padrões ignorem maiúsculas/minúsculas. |
nullglob |
Faz com que padrões glob não correspondentes expandam para nada (em vez de permanecerem). |
progcomp |
Habilita a conclusão programável de comandos. |
promptvars |
Habilita a expansão de variáveis no prompt do shell. |
sourcepath |
Procura arquivos para o comando source no PATH. |
| Código | Descrição |
|---|---|
| 0 | Execução bem-sucedida (sem erros). |
| 1 | Erro genérico ou desconhecido. |
| 2 | Uso incorreto do comando ou erro de sintaxe (invocação inválida). |
| 126 | Comando encontrado, mas não executável. |
| 127 | Comando não encontrado. |
| 128 | Erro relacionado a um sinal de término inválido. |
| 130 | Script terminado pelo usuário (Ctrl+C envia sinal SIGINT). |
| 137 | Processo terminado pelo sistema (exemplo: sinal SIGKILL). |
| 139 | Falha de segmentação (segmentation fault). |
| 255 | Erro fora do intervalo esperado (para falhas gerais). |
if [[ -n "$DISPLAY" ]]; then
PS1=$'
\[\e[0;36m\]${PWD##*/}\[\e[0m\] \
\[\e[0;35m\]$(git branch --show-current 2>/dev/null)\[\e[0m\]
\[\e[0;32m\]❯\[\e[0m\] '
else
PS1=$'\n\[\e[0;36m\]$(pwd)\[\e[0m\] \n\[\e[0;32m\]>\[\e[0m\] '
fiMangá
awk '/wp-manga-chapter-img">$/ {print $0}' site.url
wget $(curl 'site' | grep -Eo 'https://mangalivre.to/wp-content/uploads/WP-manga/data.+.webp')
curl 'site' | grep -Eo 'https://mangalivre.to/wp-content/uploads/WP-manga/data.+.webp' | xargs wgetRenomear bak arquivo com prefixo ou sufixo:
cp file{,novo}.txt
cp {,bkp-}file.txt
cp file.txt{,.bak}Confirma comando posterior:
yes | pacman -S pkgRenomear bak arquivo:
echo $var\1
# igual
echo ${var}1Número dos processadores:
nprocShift:
set {A..F}
echo $*
A..F
shift
B..FValor padrão:
# Recebe o valor de $1, caso não exista recebe usuário
user=${1:-usuario}
# Caso valor de $1 esteja vazia recebe $USER
user=${1:=$USER}Transforma comando em um arquivo:
arq=<(ls)
echo "$arq"Alias
# alias live="live-server"
# alias live=" python -m http.server -b 127.0.0.1 8000
# alias xf="sassc -M -t expanded $HOME/.local/share/themes/Lightly/gtk-3.0/src/main.scss \
# Config
# $HOME/.local/share/themes/Lightly/gtk-3.0/gtk.css && \
# xfce reload theme
# xfconf-query -c xsettings -p /Net/ThemeName -r && \
# xfconf-query -c xsettings -p /Net/ThemeName -s Lightly"