Como atribuir o status de sucesso / falha de uma função a uma variável no Bash?

1

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()
    
por Santi Santichaivekin 14.01.2018 / 01:11

3 respostas

3

cmd && result=true || result=false
    
por 14.01.2018 / 01:29
1

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 .

    
por 14.01.2018 / 09:01
0

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.

    
por 22.01.2018 / 15:26