statement blocks Mecanismo no script do shell?

6

No livro Início da programação do Linux . Há uma seção sobre o Bloco de instruções . Nessa porção, a explicação é semelhante à seguinte.

Blocos de declaração

Se você quiser usar várias instruções em um local em que apenas uma é permitida, como em uma lista AND ou OR, você pode fazê-lo colocando-os entre chaves {} para criar um bloco de instruções. Por exemplo, veja o seguinte código:

get_confirm && {
    grep −v "$cdcatnum" $tracks_file > $temp_file 
    cat $temp_file > $tracks_file
    echo
    add_record_tracks
}

Por favor, explique como o código está sendo executado no bloco de instruções ...

    
por Md. Alamin Mahamud 04.09.2017 / 21:33

1 resposta

9

O código dentro de { ... } é executado exatamente da maneira que seria executado sem as chaves, exceto que agora depende do status de saída de get_confirm .

Se get_confirm sair com um status de saída zero ("sucesso"), o bloco será executado, caso contrário, não.

É equivalente a

if get_confirm; then
    # the contents of the block goes here
fi

(o que eu acho mais legal)

O exemplo do livro é IMHO não é um bom exemplo de uso comum de { ... } . Um melhor exemplo teria sido

{ echo 'hello world'; date; } >file

que usa um único redirecionamento para redirecionar a saída padrão de ambos os comandos no bloco { ... } para o mesmo arquivo.

Isto é semelhante a (e tem o mesmo efeito, neste caso, como)

( echo 'hello world'; date ) >file

mas as declarações dentro de { ... } são executadas no mesmo ambiente que o shell, enquanto as declarações em ( ... ) são executadas em um subshell (um ambiente separado).

Você pode ver a diferença com

{ a=42; }; echo $a

e

( a=1973 ); echo $a

O primeiro produzirá 42 , enquanto o segundo não produzirá 1973 (a atribuição acontece em um subshell e não pode afetar o ambiente externo).

Aviso sobre a gramática: o bloco } de { ... } de fechamento deve seguir uma nova linha ou um ; . { echo 'hello' } não é válido, enquanto { echo 'hello'; } e

{ 
    echo 'hello'
}

são.

    
por 04.09.2017 / 21:53