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