Estou escrevendo um script bash.
De acordo com este post original , aprendi que c=${a:-b}
pode ser usado para definir a variável c
se var a
estiver indefinido ou vazio.
Gostaria de saber se podemos estender este caso para atribuir a saída de um comando a um var. Por exemplo, eu tenho um comando bash some command
e posso atribuí-lo ao var c
com
c=$(some command)
Mas também quero incluir o caso de que, se a saída de some command
estiver vazia, atribuo outro valor padrão a c.
Eu sei que posso escrever vanilla if-else
no script bash, mas gostaria de saber se existe alguma maneira mais elegante semelhante a c=${a:-b}
?
Em zsh, você pode fazer:
Mas em qualquer shell do tipo POSIX, incluindo bash, você sempre pode fazer:
Ou
Você perde o status de saída, mas pode salvá-lo em uma variável entre as duas etapas:
Você também pode fazer coisas como:
Para
$var
ser definido comodefault
secmd
falhou (independentemente de produzir algo ou não).Observe que, se
cmd
a saída não estiver vazia, mas consistir apenas em caracteres de nova linha, depoisvar=$(cmd)
de ,$var
ainda estará vazio, pois a substituição do comando remove todos os caracteres de nova linha à direita.bash
também remove todos os caracteres NUL.zsh
os preserva, alguns outros shells retiram tudo após o primeiro caractere NUL.yash
engasga com sequências de bytes que não formam caracteres válidos na localidade.Para
$var
ser definido comodefault
somente secmd
a saída de ' não for vazia, com GNUgrep
(ou qualquer implementação que possa lidar com (e não modificar) entrada não-texto e não ignorar linhas não delimitadas), você pode fazer:onde
grep '^'
retorna true se encontrar o início de pelo menos uma linha em sua entrada (e passar toda a entrada sem perturbações para sua saída).Nesse caso,
cmd
o status de saída de 's é perdido.$var
pode acabar ficando vazio secmd
gerar apenas NULs ou novas linhas.