Skip to content

Latest commit

 

History

History
663 lines (490 loc) · 14 KB

File metadata and controls

663 lines (490 loc) · 14 KB

Bash

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 $BASHPID

Repete o mesmo comando anterior do usuário:

sudo !!

Cria um arquivo novo ou excluí o conteúdo de um existente:

ls >teste.txt

Recebe 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')" > nums

Diretó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 # Desativa

Adicionaconteúdo em algum arquivo existente:

ls >>teste.txt

Redirecionamento:

teste < arquivo

cat << eof
teste
eof

grep 'teste' <<< 'teste'

Pesquisar uma palavra em diversos arquivos:

grep -r 'palavra' dir

Executa o segundo enquanto o primeiro ainda está em execução:

comando1 & comando2

Executa o segundo comando caso o primeiro seja ok:

comando1 && comando2

Pasta atual current dir:

cwd=$(dirname "$0")

Repete var:

echo ${var}{,}
vida vida
echo ${var}{,,,}
vida vida vida vida

Inicia variável:

: "${var:=Iniciada}"

Executa o segundo caso o primeiro falhe:

comando1 || comando2

Expandi variável:

var="banana laranja"
ctrl+alt+e = expandi as variáveis no terminal

Executa o segundo sem está em uma nova linha:

comando1; comando2

Recebe argumento de entrada:

local entrada1=$1
local entrada2=$2

Recebe valor de entrada:

read -rp "Digite um valor: " nome_var

Testa saída do comando:

if ls; then
  echo "comando executado com sucesso"
else
  echo "comando terminado com falha"
fi

Oculta qualquer tipo de erro:

comando &>/dev/null

Descobrir 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 $9

Repetindo 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+=b

Renomear múltiplas extenções:

for file in *.json; do
  mv "$file" "${file%.json}.yml"
done

Receber 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>"|ge

Rename pattern:

for file in pattern*;
  do mv "$file" "${file//*_/}";
done

Debug:

set -x
...code debug...
set +x

Alinhando texto:

column -t arq.csv

Exibe arquivo formatado com 60 colunas:

fold -sw 60 arq.txt

Curl 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
fi

Ir para a parte final do arquivo:

less +F arq

Exibe texto com marcas de nova linha:

cat -et

Converter 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'
fi

List recent files:

ls ** -t | head

Move to current dir:

mv <path> .

Edit file with sudo, with current config:

sudoedit <file>
sudo -Es nvim <file>

Size of files:

ls -sh | sort -hr

Show size of dirs:

du -h --max-depth=1 | sort -hr
ncdu

Writing lists:

declare -c profs=(julio rubens)
echo ${profs[@]}
Julio Rubens

List recursive files with path:

ls -R | grep png | xargs realpth

Show cr ms:

cat -A file.dos

# Solver ^M$
tr -d '\r' < file.dos | cat -et

Efeito de digitação:

content='Esse é um texto'; delay=0.01
for((i = 0; i < ${#content}; i++)); do
  echo -n "${content:$i:1}"
  sleep $delay
done

Remove 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-xxx

Ler QRCode:

zbarimg qr.png

Gerar QRCode:

qrencode "Text" -o qr.png

Remover caracteres repetidos:

# teste---mago -> teste-mago
echo "${var//+(-)/-}"

Shopts

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ódigos de saída

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).

PS1 show only one dir

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\] '
fi

Mangá

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 wget

Renomear bak arquivo com prefixo ou sufixo:

cp file{,novo}.txt
cp {,bkp-}file.txt
cp file.txt{,.bak}

Confirma comando posterior:

yes | pacman -S pkg

Renomear bak arquivo:

echo $var\1
# igual
echo ${var}1

Número dos processadores:

nproc

Shift:

set {A..F}
echo $*
A..F
shift
B..F

Valor 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"

Links