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.