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 levariable
asignen la forma que desee, los valores deben enviarse a la salida estándar. Esto se hace fácilmente con elecho
comando:Esto funcionará
bash
tan bien como todos los demás shells POSIX.Los Parens izquierdos opcionales
De acuerdo con el estándar POSIX, los parentes izquierdos en una
case
declaració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 loscase
patrones, pero algunos shells sí lo requerían y requerían la apertura(
cuandocase
se 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 ejecutar1
como un comando.Puedes usar este idioma. Tenga en cuenta que
color_code
estará vacío si$COLOR
ninguno 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