Bash si está en una sola línea

50

Me gustaría saber cómo puedo escribir si las condiciones dentro de un script bash en una sola línea.

Por ejemplo, ¿cómo puedo escribir esto en una sola línea y luego poner otra como esta en la siguiente?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

Pregunto esto porque tengo bastantes alias en mi .bashrc y tengo el mismo .bashrc (sincronizado) en varios sistemas, pero no necesito todos los alias en cada sistema. Puse la mayoría de ellos dentro de las declaraciones if, y todo funciona muy bien ahora, pero ocupan mucho espacio, 3 líneas cada una más la línea en blanco entre ellas (me gusta tenerlas fácilmente visibles)

También usaré esta técnica para variables de entorno también.

Horațiu Mlendea
fuente
44
También puedes escribir[ -f "/usr/bin/wine" ] && export WINEARCH=win32
glenn jackman
3
Tenga en cuenta que más corto no es necesariamente mejor. Puede obtener errores lógicos sutiles con los operadores lógicos del shell. Elija lo que es más fácil de leer y mantener.
Glenn Jackman

Respuestas:

83

Lo escribirías como tal:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

Tenga en cuenta que esto también podría escribirse (como lo sugiere @glennjackman):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32
Dr_
fuente
1
Bueno, eso fue fácil ... :) Ahora me siento un poco incómodo por preguntar eso. Gracias por la respuesta, ¡me ayudó mucho!
Horațiu Mlendea
77
Hay una diferencia 1. la expresión saldrá con estado 0, 2. la expresión saldrá sin estado 0 si el archivo no existe. Esto puede marcar la diferencia si usa esto en algunas tareas automatizadas como la implementación donde el éxito de la tarea depende del estado de salida del comando.
Jānis Gruzis
@ HorațiuMlendea obviamente fue fácil. si sabes como Pero la sintaxis es complicada, por ejemplo, [1 == 1] es un error pero [1 == 1] funciona. Y los punto y coma. ¿Cómo puedes sentirte incómodo por no conocer una sintaxis mal diseñada? Tu "sentimiento" no tiene ningún sentido. Esta fue una pregunta útil, aunque desafortunadamente no entiendas por qué.
barlop
@balop no, entiendo totalmente lo que quieres decir y estoy de acuerdo. Es solo que en ese momento entendí los bits individuales que formaban esa sintaxis (la que tenía &&). Por lo general, es fácil e intuitivo armar las cosas, pero como dijiste, este lenguaje es bastante complicado y no muy intuitivo.
Horațiu Mlendea
4

También encuentro que simplemente escribiendo cualquier comando complejo si luego, presiono enter, y luego, después de que se ejecute, simplemente presione la flecha hacia arriba. La línea de comando repetirá el último comando escrito, por supuesto, pero en este caso lo pone todo en una línea según lo requiera. Es un truco, pero es efectivo.

Alan
fuente
55
Tenga en cuenta que esto podría depender de su shell (y posiblemente más de la configuración de su shell). Algunas pruebas rápidas en mi computadora muestran que esto funciona en Bash (así que tenga un +1), pero Zsh conserva los saltos de línea al volver a los comandos anteriores.
8bittree