Cómo hacer "si la variable a tiene el patrón 'abc', haga x; de lo contrario, haga y" (en 1 línea)

Cómo hacer "si la variable a tiene el patrón 'abc', haga x; de lo contrario, haga y" (en 1 línea)

Quiero establecer un alias dependiendo de una coincidencia de patrón de variable ambiental en 1 línea.

Estoy intentando:

[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

pero lo entiendo-bash: [[uscamwebq20.boston.zipcar.com: command not found

También probé:

$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'

pero lo entiendo-bash: [: too many arguments

Respuesta1

case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac

Recibes un error porque faltan espacios después [[y porque -zes para probar si una cadena en particular está vacía. [[es una característica no estándar, su comportamiento depende de la versión de bash. La caseestructura es POSIX y, tal como está escrita, funcionará en cualquier shell POSIX y en cualquier versión de bash.

En términos más generales, también es mejor mantenerse alejado de cosas como, cmd1 && cmd2 || cmd3ya que generalmente no hace lo que quieres si cmd2falla.

Además, no veo el sentido de ponerlo todo en una sola línea. Eso es algo que irá a algún archivo rc, ¿verdad? Entonces será mucho más legible si está en varias líneas.

case $HOSTNAME in
  (*q20*) alias a='cd ~/a1';;
      (*) alias a='cd ~/a99'
esac

es más legible y portátil que:

if [[ $HOSTNAME =~ q20 ]]; then
  alias a='cd ~/a1'
else
  alias a='cd ~/a99'
fi

en sí mismo más legible (y más correcto) que:

[[ $HOSTNAME =~ q20 ]] &&
  alias a='cd ~/a1' ||
  alias a='cd ~/a99'

en sí mismo es más legible que

[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

Respuesta2

Puedes usar el primer formulario pero debes poner un espacio en blanco después [[. Ver:

$ type [[
[[ is a shell keyword

$ help [[
[[ ... ]]: [[ expression ]]
    Execute conditional command.

Entonces tu comando debería verse así:

[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

información relacionada