Eu estou procurando uma maneira de obter resultados com base em uma condição if dentro de uma condição de caso no bash. Por exemplo:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
No código acima, se a variável VAR
for 1
, eu gostaria que a condição do caso fosse executada.
bash
shell-script
case
Smashgen
fonte
fonte
if [ $VAR -eq 1 ]; then
parte do código para o que quer que esteja*)
? Porque isso é totalmente diferente do que é chamado de avanço, tornando a sua pergunta um pouco enganosa.Respostas:
Você não pode. A maneira de obter uma
case
queda é substituir o;;
separador por;&
(ou;;&
). E é um erro de sintaxe colocar isso dentro de um if.Você pode escrever toda a lógica como uma condicional regular:
fonte
if
.Eu sugiro reestruturar sua lógica: coloque o código "fallthrough" em uma função:
saídas
fonte
O script a seguir transforma seu teste "de dentro para fora", no sentido em que testamos
$var
primeiro e, em seguida, realizamos o procedimento (usando;&
em acase
), dependendo$input
.Fazemos isso porque a questão de "executar a descoberta" deve ou não ser realmente apenas dependente de
$input
se$var
é1
. Se houver algum outro valor, a questão de fazer a descoberta nem precisa ser feita.Ou, sem
case
:fonte
*)
. Já tenho meu +1.Não é algo que eu faria, mas você poderia conseguir algo com:
fonte
Teste as duas variáveis de uma vez (bash 4.0-alpha +):
No teste:
Limpo e simples.
Entenda que o valor testado (
$new
) deve ter apenas dois valores possíveis, é por isso que a cláusula if existe, para transformar VAR em um valor booleano. Se o VAR puder ser um booleano, teste0
(não1
) nocase
e remova oif
.fonte
Você pode tornar a substituição padrão, mas colocar uma condição que o código executa apenas se a condição for atendida
Mas como o ilkkachu sugeriu, você também pode usar condições em vez de mudar.
fonte
Se você não se importa com alguém reclamando, ele não entende seu código, basta mudar a ordem dos dois condicionais:
Ou:
Simples e claro (pelo menos para mim).
case
não suporta queda por si só. Mas você pode substituir*)
por&&
afteresac
para fazer respeitar os valores de retorno de outras ramificações.fonte
Os operadores new
;&
e;;&
foram introduzidos naBash
4.0 e, embora ambos possam ser úteis em situações semelhantes, acho que não são úteis no seu caso. É o queman bash
diz sobre esses operadores:Em outras palavras,
;&
é uma queda através de e como a conhecemos a partirC
e;;&
marcasbash
verificar restantes casos, em vez de retornar decase
bloco inteiramente. Você pode encontrar um bom exemplo de;;&
ação aqui: /programming//a/24544780/3691891 .Dito isto, nem
;&
nem;;&
poderia ser usado em seu script, porque os dois iriam para o*)
que sempre seriam executados.O script a seguir funciona e faz o que você deseja sem reorganizar a lógica, mas considere-a apenas como um exemplo e nunca confie nela, é muito frágil. Eu peguei a ideia daqui :
fonte
jumpto
função e executa o que vier depois dela. O fato de isso ser equivalente a continuar executando após o bloco entreft:
e;;
é uma coincidência, porquejumpto
é o último comando no mesmo comando complexo que o bloco saltado para.