Em muitos idiomas, é possível atribuir o resultado de uma instrução case / switch a uma variável, em vez de repetir a atribuição da variável várias vezes na instrução case. É possível fazer algo assim no shell Bash?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(Ou, como um aparte, em outras conchas?)
bash
shell
assignment
case
iconoclasta
fonte
fonte
(
s extras . Caso contrário, está tudo bem.Respostas:
A
variable=$(...)
construção pegará a saída padrão de qualquer comando$(...)
e a atribuirávariable
. Portanto, para obter avariable
atribuição desejada, os valores devem ser enviados para a saída padrão. Isso é feito facilmente com oecho
comando:Isso funcionará
bash
, assim como em todos os outros shells POSIX.Parens opcionais à esquerda
De acordo com o padrão POSIX, a esquerda parens em uma
case
instrução é opcional e o seguinte também funciona:Como Gilles aponta nos comentários, nem todos os shells aceitam os dois formulários em combinação com
$(...)
: para uma tabela de compatibilidade impressionantemente detalhada, consulte "$ ()" substituição de comando vs. incorporado ")" .fonte
(
como opcional. Eu pensei que poderia ajudar a evitar que o)
erro seja interpretado como o fechamento)
da$(...)
expressão.(
é opcional: o código funciona da mesma forma sem ou sem eles. Só os deixei de lado porque, para o bem ou para o mal, isso é tradição. A parte principal da solução proposta é o uso deecho
.(
para oscase
padrões, mas algumas conchas exigiam a abertura(
quandocase
usadas em uma substituição de comando. Conchas modernas são boas de qualquer maneira. Veja in-ulm.de/~mascheck/various/cmd-substcolor_code=$(…)
atribui a saída do…
comando à variávelcolor_code
, com as novas linhas finais removidas. Então você precisa produzir alguma saída. O código que você escreveu tenta executar1
como um comando.Você pode usar esse idioma. Observe que
color_code
ficará vazio se$COLOR
nenhum dos valores suportados.Mas não é muito idiomático. A linguagem shell é voltada para combinações simples de comandos simples. Essa grande substituição de comando é estranha. A substituição do comando cria um subshell, que é mais lento que o método direto:
A principal diferença semântica entre as duas abordagens é que
$(…)
cria um subshell, de forma que qualquer atribuição, saída, redirecionamento etc. executada por dentro não tem efeito externo.fonte