eu tentei
#!/bin/bash
distro=""
myvar1=[[ -n "$distro" ]] && echo $distro || echo "debian"
myvar2=$((-n $distro ? $distro : "debian"))
estes são os resultados do script
./build.sh: line 5: -n: command not found
debian
./build.sh: line 6: -n ? : debian: expression expected (error token is ": debian")
Como sempre,
A && B || C
não é um operador ternário adequado, pois é executadoC
ifA
is false ou ifB
is false . Isso realmente deveria sair do seu vocabulário.Você quer:
Ou
if A; then B; else C; fi
se você precisar em uma linha.No seu caso:
Existe um operador ternário nas expressões aritméticas no estilo C, mas isso é apenas para aritmética, portanto funciona apenas para números (no caso de
bash
, isso é limitado até mesmo a números inteiros decimais ).Você pode fazer:
Mas não atribua strings a
myvar
.Aqui, porém, existem operadores dedicados do shell Bourne (do final dos anos 70) para esse propósito:
Onde
${distro:-debian}
se expande paradebian
se$distro
não estiver definido ou vazio.Ou
Onde
${distro:=debian}
funciona como${distro:-debian}
e também atribuidebian
se$distro
não$distro
foi definido ou está vazio. Observe a necessidade de aspas em torno da expansão, pois agora é um contexto de lista.Observe as variantes sem
:
for unset only em vez de unset ou empty .