cmd && result=true || result=false
Eu sei que uma maneira de fazer isso é:
# run a command here, like [[ $A == *"ABC"* ]]
result=$?
if (( result == 0 ))
then
result=true
else
result=false
fi
Então eu posso fazer:
if $result
then
...
Existe uma maneira de uma linha para escrever o primeiro bloco de código? Eu posso fazer algo assim em C:
bool result = funct_a() && funk_b()
cmd && result=true || result=false
Normalmente, você colocaria o comando diretamente na instrução if , em vez de ir em torno de $? e (( .. )) . Especialmente com algo como [[ .. ]] : ele é feito para parecer uma estrutura condicional.
if [[ $A == *"ABC"* ]]; then
result=true
dosomethinghere
...
Além disso, observe que, se você executar if $result ... , na verdade, estará executando o comando contido na variável result . true e false são bons para executar como comandos, mas você não gostaria de fazer isso se result pudesse conter algo como rm ...
Em vez disso, você pode salvar o valor de $? como você fez acima, com result=$? e usar if (( result == 0 )) ou if [[ $result == 0 ]] quando precisar, em vez de adicionar outro nível de atribuições a result .
Você pode fazer isso:
cmd; f result
com ajuda desta pequena função:
f () { last="$?"; declare -n ref="$1"; [[ "$last" == 0 ]] && ref=true || ref=false;}
(Você poderia chamar essa função de algo mais adequado do que apenas f ... não sei o que é mais adequado.) De qualquer forma, ela deve ser aplicada imediatamente após o comando e separada do comando com um ponto-e-vírgula , não encadeada com && ou || . Leva o nome de uma variável de resultado sem o $ . A função faz uma referência do nome passado e o resto é óbvio.
Aqui está uma demonstração:
$ f () { last="$?"; declare -n ref="$1"; [[ "$last" == 0 ]] && ref=true || ref=false;}
$ true; f result; echo "$result"
true
$ false; f result; echo "$result"
false
Você também pode optar por um auxiliar ainda mais sofisticado:
g () { declare -n ref="$1"; shift; "$@" && ref=true || ref=false; }
Este é suposto ser fornecido com a variável de resultado seguida pelo comando. O resto é o mesmo. Aqui está g em ação:
$ g () { declare -n ref="$1"; shift; "$@" && ref=true || ref=false; }
$ g result ls -lt; echo "$result"
total 2488
drwxr-xr-x 6 tomas tomas 4096 Jan 22 11:41 Documents
drwxr-xr-x 2 tomas tomas 4096 Jan 22 11:26 Pictures
...
true
$ g result asdfasdf; echo "$result"
bash: asdfasdf: command not found
false
Ou você pode manter os nomes f e g , se quiser.