Como fazer "se a variável a tiver o padrão 'abc' faça x, caso contrário faça y" (em 1 linha)

Como fazer "se a variável a tiver o padrão 'abc' faça x, caso contrário faça y" (em 1 linha)

Quero definir um alias dependendo de uma correspondência de padrão de variável ambiental em 1 linha.

Eu estou tentando:

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

mas eu entendo-bash: [[uscamwebq20.boston.zipcar.com: command not found

Eu também tentei:

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

mas eu entendo-bash: [: too many arguments

Responder1

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

Você está recebendo um erro, porque faltam espaços depois [[e porque -zé para testar se uma determinada string está vazia. [[é um recurso não padrão, como ele se comporta depende da versão do bash. A caseestrutura é POSIX e conforme escrita funcionará em qualquer shell POSIX e em qualquer versão do bash.

De maneira mais geral, também é melhor ficar longe de coisas assim, cmd1 && cmd2 || cmd3pois geralmente não faz o que você deseja se cmd2falhar.

Além disso, não vejo sentido em colocar tudo em uma linha. Isso é algo que irá para algum arquivo rc, certo? Então será muito mais legível se estiver em várias linhas.

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

é mais legível e portátil do que:

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

em si mais legível (e mais correto) do que:

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

em si mais legível do que

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

Responder2

Você pode usar o primeiro formulário, mas precisa colocar um espaço em branco depois [[. Ver:

$ type [[
[[ is a shell keyword

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

Então seu comando deve ficar assim:

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

informação relacionada