Como eu posso encurtar um if then else usando o formato []

0

Eu quero encurtar isso para um forro:

if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi

Eu freqüentemente uso [] para condicionais, por exemplo [ -z(or -n) condition] , mas ainda não teve que fazer outra parte neste formato.

Em ruby eu faria condition ? true : false Existe um equivalente em bash?

Eu tentei

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'

mas obviamente esse não é o jeito certo de fazê-lo.

Eu quero um one-liner porque eu quero que todo o meu .bashrc caiba em uma pequena janela (< ~ 50 linhas) então, como com outros multi-liners, eu os condenso em um forro quando possível. Estou confortável em sacrificar a legibilidade por tamanho para este exemplo.

Eu também tentei:

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

e

[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

e

[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

mas sempre recebo o alias 'else' não o alias 'then'

Eu poderia simplesmente reverter isso, mas suspeito que, como não está funcionando bem, isso não ajudaria. A única maneira de ter certeza é tentar no OSX e eu estou no Ubuntu agora.

    
por Michael Durrant 10.05.2014 / 15:00

2 respostas

2

tl; dr;

Use

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G''

Detalhes ....
[...] são necessários apenas para avaliar expressões condicionais (estatísticas de arquivos, comparações de sequências, comparações numéricas; consulte CONDITIONAL EXPRESSIONS in bash(1) ). Eles também seriam necessários para isso em uma construção if ... ; then ...; else .

Para construções relativamente simples

if CONDITION; then
    EXPR1
else
    EXPR2
fi

pode ser substituído por

CONDITION && EXPR1 || EXPR2

Se você não precisa de [...] no primeiro caso, não é necessário para o segundo.

No seu caso, CONDITION é ls --version 2>/dev/null | grep -q 'coreutils' , que é o código de retorno de grep . Então você pode simplesmente escrever

ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'

BTW: seria mais fácil verificar se ls suporta --color diretamente:

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'
    
por 10.05.2014 / 15:24
1

Com zsh , pode ser compactado para:

if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}

A construção cmd1 && cmd2 || cmd3 como substituta para if / then / else deve geralmente ser evitada, já que não é a mesma.

Em

cmd1 && cmd2 || cmd3'

cmd2 é executado se cmd1 retornar true . E cmd3 é executado se% decmd1 ou cmd2 retornar falso.

No seu caso, é muito improvável que cmd2 ( alias ) retorne false, mas é fácil esquecer o problema no caso geral, por isso é melhor evitar essa construção em primeiro lugar.

A única razão real em que pode ser útil é quando você quer escrever código que funcione tanto em shells parecidos com Bourne quanto em csh (ou rc -como aqueles que funcionam como bem) onde a construção if/then/else tem uma sintaxe diferente.

    
por 10.05.2014 / 17:40

Tags