Como Converter seu Shell Script em BASH para FISH

Com uma tabela comparativa que lhe ajudará a portar facilmente.


Como Converter seu Shell Script em BASH para FISH

Algumas pessoas gostariam realmente de migrar seus shell scripts em BASH para algum outro interpretador.

Apesar do ZSH ser o mais amado e o BASH o mais utilizado, o FISH é o mais desejado! 😃

A gente possui um conteúdo muito vasto sobre BASH, inclusive 2 cursos:

E entre outros por aqui no blog que são bem antigos, logo, não consigo encontrá-los por tags. Além de muitas outras coisas!!!

Sobre FISH possuimos esse vídeo: Fish Shell, mais produtividade no seu Shell Script e também esse artigo: Instale o Oh My Fish no seu Linux ou Unix-like.


Suponhamos que você possui o seguinte script em BASH:

Um script que gera números randômicos entre 1 e 2 e obtém o elemento de um array de acordo com esse número e compara com uma variável declarada e definida.

Em BASH :

nvim get.sh

#!/usr/bin/env bash
var="Fish"
rand=$(( $RANDOM % 2 + 1 ))
vararr=("C++" "Bash" "Fish" "Python" "Lua")

verificar(){
  if [[ ${vararr[$rand]} == "${var}" ]]; then
    echo "São iguais, ${vararr[$rand]}!!! 'rand' é ${rand} ."
  else
    echo "'${var}' é diferente de '${vararr[$rand]}' porque 'rand' é $rand"
  fi
}

verificar

Rode como: bash get.sh

O mesmo script:

Em FISH :

nvim get.sh

#!/usr/bin/env fish
set var "Fish"
set rand (random 2 3)
set vararr C++ Bash Fish Python Lua

function verificar;
  if [ $vararr[$rand] = $var ];
    echo "São iguais, $vararr[$rand]!!! 'rand' é '$rand'"
  else 
    echo "'$var' é diferente de '$vararr[$rand]' porque 'rand' é $rand"
  end
end

verificar

Rode como: fish get.sh

Dá pra complicar um poquinho, né?!


Traduzindo seus scripts de BASH para FISH

A documentação do FISH oferece essa tabela comparativa que ajuda muito para você portar seus scripts. Eu dei uma incrementada em algumas coisas, mas a tabela por si só vai lhe ajudar muito, segue:

Ação BASH FISH Observações
Rodar um comando na Subshell "$(command)" (command)
Substituição de comando em uma string "foo bar $(command)" "foo bar "(command)
Substituição de processo command <(command) command (command \| psub)
Lógica AND entre comandos command1 && command2 command1; and command2 ou command1 && command2 (FISH 3.0)
Código de saída do último comando $? $status
Logica com NOT ! command not command ou ! command (FISH 3.0)
Obter o PID $$ $fish_pid antigamente %self (disponível a partir da versão 3.3.1)
Obter o último PID $! $last_pid antigamente %last
Redirecionar para STDERR command 2>/dev/null command 2>/dev/null command ^/dev/null está desativado por padrão em 3.3.0, ainda pode ser reativado usando flags
Anexar o STDERR para o STDOUT command 2>&1 command 2>&1
Redirecionar para STDOUT command >/dev/null command >/dev/null
Rodar um comando na Subshell command & command &
Rodar comando definindo Variável de Ambiente VARIABLE=value command VARIABLE=value command
Declarar uma variável foo=bar set foo bar Por padrão, as variáveis BASH são globais, as variáveis FISH têm escopo de função
Apagando uma variável unset foo set -e foo
Verificar se uma variável está definida [[ ${var+_} ]] ou [[ -v var ]] (desde BASH 4.2) set -q foo
Definindo uma função fn_name() {...} function fn_name ... end
Verificar se uma função está definida typeset -f function >/dev/null functions -q function
Exportar uma variável export foo set -x foo $foo export no FISH também já está disponível por questões de compatibilidade
Exibir todos elementos de um array separados "${var[@]}" $var O BASH faz a divisão de palavras novamente em uma matriz não citada, FISH não
Exibir todos elementos de uma array como 1 só "${var[*]}" "$var"
Remover elemento de um array unset foo[1] set -e foo[2]
Contar quantos elementos há em um array "${#var[@]}" count $var
Retornar o primeiro elemento do array "${var[0]}" ou $var $var[1] No FISH, arrays começam a partir do 1
if if CONDITION; then COMMAND; fi if CONDITION; COMMAND; end Note que o FISH não usa o then e substitui o fi pelo end
for for VAR in LIST; do COMMAND; done for VAR in LIST; COMMAND; end
while while CONDITION; do COMMAND; done while CONDITION; COMMAND; end
Passas argumentos para função $*(Como somente $1) ou $@(Como $1, $2, …) $argv
Expansão de parâmetros foo=${bar-word} set -q bar && set foo $bar \|\| set foo word  
Expansão de parâmetros foo=${bar:-word} test -n $bar && set foo $bar \|\| set foo word  

Referências e Dicas de Leitura


shellscript bash


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo

Artigos Relacionados




Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!


caso queira entrar em contato conosco, envie-nos um e-mail.