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

0

Eu quero definir um alias dependendo de uma correspondência de padrão de variável de ambiente em uma linha.

Estou tentando:

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

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

Eu também tentei:

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

mas recebo -bash: [: too many arguments

    
por Michael Durrant 12.06.2014 / 15:22

2 respostas

3

Você pode usar o primeiro formulário, mas precisa colocar um espaço em branco após [[ . Veja:

$ type [[
[[ is a shell keyword

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

Assim, seu comando deve ficar assim:

[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
    
por 12.06.2014 / 15:33
7
case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac

Você está recebendo um erro, porque os espaços estão faltando após [[ e porque -z é testar se uma string específica está vazia. [[ é um recurso não padrão, como ele se comporta depende da versão de bash . A estrutura case é POSIX e, como escrita, funcionará em qualquer shell POSIX e em qualquer versão de bash .

Em geral, também é melhor ficar longe de coisas como cmd1 && cmd2 || cmd3 , pois geralmente ele não faz o que você quer se cmd2 falhar.

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

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

é mais legível e portátil que:

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

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

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

se mais legível que

[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
    
por 12.06.2014 / 15:26

Tags