En muchos idiomas es posible asignar el resultado de una declaración de caso / cambio a una variable, en lugar de repetir la asignación de variable muchas veces dentro de la declaración de caso. ¿Es posible hacer algo así en el shell Bash?
color_code=$(case "$COLOR" in
  (red)    1;;
  (yellow) 2;;
  (green)  3;;
  (blue)   4;;
esac)(O, como un aparte, en cualquier otro caparazón?)
                    
                        bash
                                shell
                                assignment
                                case
                                
                    
                    
                        iconoclasta
fuente
                
                fuente

(s extra . De lo contrario, está bien.Respuestas:
La
variable=$(...)construcción tomará la salida estándar de cualquier comando que se encuentre$(...)y se la asignarávariable. Por lo tanto, para que levariableasignen la forma que desee, los valores deben enviarse a la salida estándar. Esto se hace fácilmente con elechocomando:Esto funcionará
bashtan bien como todos los demás shells POSIX.Los Parens izquierdos opcionales
De acuerdo con el estándar POSIX, los parentes izquierdos en una
casedeclaración son opcionales y lo siguiente también funciona:Como Gilles señala en los comentarios, no todos los shells aceptan ambas formas en combinación con
$(...): para una tabla de compatibilidad impresionantemente detallada, vea "$ ()" sustitución de comando vs. incrustado ")" .fuente
(como opcional. Pensé que podría ayudar a evitar que)se malinterprete como el cierre)de la$(...)expresión.(es opcional: el código funciona igual sin o sin ellos. Los dejé solo porque, para bien o para mal, eso es tradición. La parte clave de la solución propuesta es el uso deecho.(para loscasepatrones, pero algunos shells sí lo requerían y requerían la apertura(cuandocasese usa en una sustitución de comando. Las conchas modernas están bien de cualquier manera. Ver in-ulm.de/~mascheck/various/cmd-substcolor_code=$(…)asigna la salida del…comando a la variablecolor_code, con nuevas líneas finales eliminadas. Entonces necesita producir algo de salida. El código que escribió intenta ejecutar1como un comando.Puedes usar este idioma. Tenga en cuenta que
color_codeestará vacío si$COLORninguno de los valores es compatible.Pero no es muy idiomático. El lenguaje shell está orientado a combinaciones simples de comandos simples. Esta gran sustitución de comando es incómoda. La sustitución del comando crea una subshell, que es más lenta que el método directo:
La principal diferencia semántica entre los dos enfoques es que
$(…)crea una subshell, de modo que cualquier asignación, salida, redirección, etc. que se realice adentro no tiene efecto afuera.fuente