Existe uma maneira de fazer algo assim
int a = (b == 5) ? c : d;
usando o Bash?
bash
syntax
conditional-operator
En_t8
fonte
fonte
bash
tem algo semelhante ao "operador ternário", no entanto,bash
isso é chamado de "operador condicional"expr?expr:expr
(consulte aman bash
seção "Avaliação Aritmética"). Lembre-se de que obash
"operador condicional" é complicado e possui algumas dicas.((...))
. Consulte Aritmética da casca .$(( ))
aritmética e avaliação aritmética(( ))
. Veja tambémhttps://mywiki.wooledge.org/ArithmeticExpression
.Respostas:
operador ternário
? :
é apenas uma forma curta deif/else
Ou
fonte
=
operador testa a igualdade das cadeias, não a igualdade numérica (ou seja,[[ 05 = 5 ]]
é falsa). Se você quiser comparação numérica, use-eq
.if/then/else
cond && op1 || op2
construção possui um erro inerente: seop1
tiver um status de saída diferente de zero por qualquer motivo, o resultado será silenciosamenteop2
.if cond; then op1; else op2; fi
é uma linha também e não tem esse defeito.Código:
fonte
echo "$c"
for um comando com alias e com várias linhas (comoecho 1; echo 2
), coloque-a entre parênteses.&&
não terá um status de saída diferente de zero. Caso contrário,a && b || c
será executado "inesperadamente"c
sea
for bem-sucedido, masb
falhar.Se a condição estiver apenas verificando se uma variável está definida, há ainda uma forma mais curta:
atribuirá
a
o valor deVAR
seVAR
estiver definido, caso contrário, atribuirá a ele o valor padrão20
- isso também pode ser resultado de uma expressão.Como alex observa no comentário, essa abordagem é tecnicamente chamada de "Expansão de parâmetros".
fonte
a=${1:-'my-hyphenated-text'}
:-
)${VAR:-yes:-no}
.A
cond && op1 || op2
expressão sugerida em outras respostas tem um erro inerente: seop1
tiver um status de saída diferente de zero,op2
silenciosamente se torna o resultado; o erro também não será detectado no-e
modo. Portanto, essa expressão só é segura de usar seop1
nunca pode falhar (por exemplo:
,true
se um builtin, ou atribuição de variável sem quaisquer operações que podem falhar (como divisão e chamadas OS)).Observe as
""
aspas. O primeiro par evitará um erro de sintaxe se$b
estiver em branco ou tiver espaço em branco. Outros impedirão a conversão de todos os espaços em branco em espaços únicos.fonte
[ "x$b" -eq "x" ]
costumava testar especificamente a string vazia. Eu gosto de usar as sintaxes usadas pelo zsh ('PARAMETER EXPANSION' na página de manual do zshexpn), mas não sei muito sobre sua portabilidade.fonte
(( ))
trata qualquer / todas as cordas como0
a=$(( b==5 ? c : d ))
Isso evitará executar a parte após || por acidente quando o código entre && e || falha.
fonte
-e
modo:(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
inserção em vez detrue
salvarexec
um programa externo.&&
..||
e ainda pegar um comando com falha entre eles?&&
e,||
por definição, aplicam-se a todo o comando antes deles. Portanto, se você tiver dois comandos antes dele (independentemente de como eles são combinados), não poderá aplicá-lo apenas a um deles e não ao outro. Você pode emularif
/then
/else
logic com variáveis de flag, mas por que se preocupar se háif
/then
/else
adequado?O comando let suporta a maioria dos operadores básicos necessários:
Naturalmente, isso funciona apenas para atribuir variáveis; não pode executar outros comandos.
fonte
Aqui está outra opção em que você só precisa especificar a variável que está atribuindo uma vez e não importa se sua atribuição é uma sequência ou um número:
Apenas um pensamento. :)
fonte
[ test ]
. Portanto, a construção só é segura se você "souber" que o comando não gera nada para o stdout.VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.O seguinte parece funcionar para meus casos de uso:
Exemplos
e pode ser usado em um script como este:
andorinha-do-mar
fonte
tern
parte do Bash? Mac parece não ter issochmod 700 tern
na mesma pasta. Agora você terá umtern
comando no seu terminalPodemos usar as seguintes três maneiras no Shell Scripting para operador ternário:
fonte
Há também uma sintaxe muito semelhante para condicionais ternários no bash:
Infelizmente, ele só funciona com números - até onde eu sei.
fonte
fonte
Você pode usar isso se quiser uma sintaxe semelhante
fonte
a=$(((b==5) ? : c : d))
-$((...))
é necessário apenas quando queremos atribuir o resultado da aritmética a outra variável.Aqui estão algumas opções:
1- Use se, em seguida, em uma linha, é possível.
2- Escreva uma função como esta:
use script interno como este
3- Inspirado na resposta do caso, um uso mais flexível e de uma linha é:
fonte
Aqui está uma solução geral, que
Teste com comparação numérica
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Teste com comparação de cadeias
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
fonte
Isso é muito parecido com a boa resposta de Vladimir . Se o seu "ternário" é um caso de "se verdadeiro, sequência, se falso, vazio", você pode simplesmente fazer:
fonte
responder a:
int a = (b == 5) ? c : d;
apenas escreva:
lembre-se de que "expressão" é equivalente a $ ((expressão))
fonte
Uma alternativa orientada a cadeias, que usa uma matriz:
quais saídas:
fonte