Eu queria saber se existe uma abreviação para esse tipo de coisa.
Atualmente posso fazer.
var_empty=; [ -n "$var" ] || var_empty=1; #intermediary variable
echo "REPL_if_var_empty_otherwise_empty=${var_empty:+REPL}"
Isso é possível sem o intermediário?
eu tentei
sh -c 'readonly SAME=SAME; var=; echo test0=${var:-SAME} test1=${SAME:+REPL}; echo REPL_if_var_empty_otherwise_empty=${${var:-SAME}:+REPL}'
mas isso resulta em um bad substitution
erro no último echo
( test0=SAME test1=REPL
). Por que é que? Existe outra maneira?
No bash, ksh ou
zsh
naksh
emulação, você pode fazer:Em
zsh
:Caso contrário, você sempre pode fazer
Não tenho certeza se entendi o que você quer dizer com "sem o intermediário" - se você quer dizer "faça tudo em uma linha" ou "nem faça atribuições de variáveis, faça tudo diretamente", mas aqui estão os métodos para cada interpretação:
Método 1a - Com atribuições de variáveis:
Método 1b - Com atribuições de variáveis:
Método 2 - Sem atribuições:
Resultado:
Bônus:
Generalização - Escolha as peças que você precisa - sem necessidade de variáveis:
Substitua
echo testValue
pelo comando bruto que você usaria para atribuir sua variável.Generalização - usando awk:
Novamente, escolha os casos que você precisa (para a pergunta do OP, o valor original não é necessário, mas provavelmente é um caso de uso menos comum). Se você precisar começar a partir de uma variável,
echo
it. Se você precisar atribuir o resultado a uma variável, use a substituição de comando (envolva tudo em$( ... )
.Nota: Que eu saiba,
sed
não será útil nesses casos, porque é 100% orientado a linhas e o "caso vazio" é zero linhas por definição. Portanto,sed
sairá antes de ter a chance de processar qualquer coisa que você diga. Além disso, eu não estou muito familiarizado com Perl, mas eu não consegui descobrir - embora eu ache que alguém bom com Perl poderia. As características de Bash como{var:=param}
et al. não são particularmente úteis para o caso do OP, mas vou mencioná-los para completar. Eu gostaria que eles operassem em strings brutas em vez de apenas variáveis de string nomeadas, pelo mesmo motivo que o OP (eu gosto de evitar intermediários se não precisar deles mais tarde).