Bash se na linha única

50

Gostaria de saber como escrever se as condições contidas em um script bash em uma única linha.

Por exemplo, como posso escrever isso em uma única linha e depois colocar outra igual na próxima?

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

Eu pergunto isso porque tenho alguns aliases no meu .bashrc e tenho o mesmo .bashrc (sincronizado) em vários sistemas, mas não preciso de todos os aliases em cada sistema. Coloquei a maioria delas dentro de instruções if, e agora está tudo funcionando muito bem, mas elas ocupam muito espaço, 3 linhas cada mais a linha em branco entre elas (eu gosto de tê-las facilmente visíveis)

Também usarei essa técnica para variáveis ​​de ambiente também.

Horațiu Mlendea
fonte
4
Você também pode escrever[ -f "/usr/bin/wine" ] && export WINEARCH=win32
glenn jackman
3
Lembre-se de que mais curto não é necessariamente melhor. Você pode obter erros lógicos sutis com os operadores lógicos do shell. Escolha o que é mais fácil de ler e manter.
precisa saber é o seguinte

Respostas:

83

Você escreveria assim:

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

Observe que isso também pode ser escrito (como sugerido por @glennjackman):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32
dr_
fonte
1
Bem, isso foi fácil ... :) Agora me sinto meio estranho por perguntar isso. Obrigado pela resposta, ajudou muito!
Horațiu Mlendea
7
Há uma diferença. 1. expressão sairá com status 0, 2. expressão sairá com status diferente de 0 se o arquivo não existir. Isso pode fazer diferença se você usar isso em algumas tarefas automatizadas, como implantação, em que o sucesso da tarefa depende do status de saída do comando.
Jānis Gruzis 10/0318
@ HorațiuMlendea obviamente foi fácil. se você souber como. Mas a sintaxe é minuciosa, por exemplo, [1 == 1] é um erro, mas [1 == 1] funciona. E o ponto e vírgula. Como você pode se sentir desconfortável por não conhecer uma sintaxe complicadamente mal projetada. Seu 'sentimento' não faz nenhum sentido. Essa foi uma pergunta útil, mesmo que infelizmente você não entenda o porquê.
barlop
@ Balop não, eu entendo totalmente o que você quer dizer e eu concordo. Só que na época eu entendi os bits individuais que compunham essa sintaxe (aquela com &&). Geralmente, é fácil e intuitivo organizar as coisas, mas, como você disse, essa linguagem é bastante complicada e pouco intuitiva.
Horațiu Mlendea 12/03/19
4

Eu também acho que apenas digitando qualquer comando complexo se for o caso, pressione enter e, depois de executado, pressione a seta para cima. A linha de comando repetirá o último comando digitado, é claro, mas, neste caso, coloca tudo em uma linha conforme necessário. É uma maneira de trapacear, mas é eficaz.

Alan
fonte
5
Observe que isso pode depender do seu shell (e possivelmente ainda mais nas configurações do seu shell). Alguns testes rápidos no meu computador mostram isso funcionando no Bash (portanto, marque +1), mas o Zsh preserva as quebras de linha ao retornar aos comandos anteriores.
precisa saber é o seguinte