Bash não tem um operador goto. Tenho uma tarefa simples e não consigo descobrir como resolvê-la sem ir para ou adicionar um novo proc, e isso é indesejável.
Tenho duas condições e um bloco de código que deve funcionar assim:
[condição 1] se verdadeiro, execute alguns comandos e verifique [condição 2]; if false execute um bloco de código.
[ condição 2 ] se verdadeiro não execute o mesmo bloco de código; se false execute o mesmo bloco.
Tem solução, ou tenho que definir algum proc e usar exit
aí? Usei um sinalizador var, mas não gostei.
Com goto disponível, ficaria assim:
[ cond 1 ] || goto label 1
command
...
command
[ cond 2 ] && goto label 2
:label 1
block of code
:label 2
Algo parecido.
A maneira típica de trabalhar para usar ramificação em scripts de shell seria por meio de funções declaradas antes do bloco principal de código. No entanto, acho que o problema subjacente aqui é o lógico, e não o goto. Obviamente
label 1
é repetido, então isso pode viver como função. Mas também, a condição 2 pode ser transformada em uma função que também chamalabel 1
por uma questão de legibilidade:O que notei é que em ambas as condições você tem
if false exec a block of code
eif false exec a block of code
, portanto, uma ideia seria começar verificando se essas condições são falsas. No entanto, fazer algo comoif ! [ cond1 ] || ! [ cond2 ]
mudaria a lógica de ramificação. Você ainda pode ver a versão em pseudocódigo disso ao ver o histórico de edição de postagens.Quando mudei do Windows para o Linux na minha área de trabalho, eu tinha muitos arquivos
.BAT
e pré-existentes.CMD
para converter e não iria reescrever a lógica para eles, então encontrei uma maneira de fazer umgoto
in bash que funciona porque ogoto function
é executadosed
em si mesmo para remover todas as partes do script que não devem ser executadas e, em seguida, avalia tudo.A fonte abaixo é ligeiramente modificada do original para torná-la mais robusta :
e não me sinto culpado de forma alguma, como Linus Torvalds disse:
Fonte original do código (modificada para torná-la menos propensa a erros)
A fonte da citação
Você deve colocar o seu
block_of_code
em uma função e usar algum if/else: