Estou procurando a sintaxe correta da instrução switch com casos de queda no Bash (idealmente sem distinção entre maiúsculas e minúsculas). No PHP eu programava como:
switch($c) {
case 1:
do_this();
break;
case 2:
case 3:
do_what_you_are_supposed_to_do();
break;
default:
do_nothing();
}
Eu quero o mesmo no Bash:
case "$C" in
"1")
do_this()
;;
"2")
"3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing();
;;
esac
De alguma forma, isso não funciona: a função do_what_you_are_supposed_to_do()
deve ser acionada quando $ C for 2 OU 3.
bash
switch-statement
Mischka
fonte
fonte
function fname { echo "Inside fname"; return 0; }
oufname() { echo "inside fname"; return 0; }
colocando parens em uma chamada de função, pode parecer uma definição de função. Funções devem ser chamadas como qualquer outro programa de linha de comando, comomv
,cp
,rsync
,ls
,cd
, etc ... Neste caso nós chamamos fname assim:fname $ARGS
.do_nothing()
deve ser uma declaração SKIP? Use:
.Respostas:
Use uma barra vertical (
|
) para "ou".fonte
[23])
do_what_you_are_supposed_to_do()
, recolher o "2" e o "3" em um único caso não soluciona isso. Não tenho certeza se a edição da pergunta para esclarecer isso é razoável, pois é óbvio que muitas pessoas acharam esta resposta útil.break
no código php.) Editar a questão, ou seu título, nesta data invalidaria muitas das respostas que não fornecem queda-through lógica, e provavelmente não deve ser feito. Fall-through não estava no título até várias edições de outros usuários, mas é tarde demais para retirá-lo agora.bash
Versões recentes permitem falhas usando;&
em vez de;;
: elas também permitem retomar as verificações de casos usando;;&
lá.saída de amostra
fonte
;&
e;;&
. Eu mudei o"24"
para;;& # resume
e obtive os mesmos resultados, então ainda estou me perguntando quando você usaria o;&
avanço.?4
para[13]4
torná-lo mais óbvio e para tornar sua alteração uma alteração()
nomes de funções por trás no bash, a menos que você queira defini-los.[23]
no caso de combinar2
ou3
''
vez de""
Se incluído
""
, o intérprete (desnecessariamente) tenta expandir possíveis variáveis no valor antes da correspondência.Para correspondência sem distinção entre maiúsculas e minúsculas, você pode usar classes de caracteres (como
[23]
):Mas
abra
não atingiu a qualquer momento, porque será correspondido pelo primeiro caso.Se necessário, você pode omitir
;;
no primeiro caso para continuar testando as correspondências nos seguintes casos também. (;;
pula paraesac
)fonte
case "${C,,}" in
se o caso não é importante;;
? Você não deveria usar;&
para o avanço?;;
, preciso usar;;&
se quiser continuar o teste.do_wild_mysterious_things
fiz o meu diaTente o seguinte:
fonte
Se os valores forem inteiros, você poderá usar
[2-3]
ou poderá usar[5,7,8]
valores não contínuos.Se os valores forem string, você poderá usar
|
.fonte
shift
o final?shift
remove o primeiro argumento na lista de argumentos da CLI. Basicamente, em cada iteração desse loop, sempre$1
é usado para obter cada argumento da lista de argumentos da CLI com a ajuda deshift
.