<Anterior | Conteúdo | Próxima>
Atribuição
Embora seus usos possam não ser imediatamente aparentes, as expressões aritméticas podem realizar atribuições. Realizamos atribuições muitas vezes, embora em um contexto diferente. Cada vez que atribuímos um valor a uma variável, estamos executando uma atribuição. Também podemos fazer isso em expressões aritméticas:
[me @ linuxbox ~] $ foo =
[me @ linuxbox ~] $ echo $ foo
[me @ linuxbox ~] $ if ((foo = 5)); em seguida, echo "É verdade."; fi
É verdade.
[me @ linuxbox ~] $ echo $ foo
5
[me @ linuxbox ~] $ foo =
[me @ linuxbox ~] $ echo $ foo
[me @ linuxbox ~] $ if ((foo = 5)); em seguida, echo "É verdade."; fi
É verdade.
[me @ linuxbox ~] $ echo $ foo
5
No exemplo acima, primeiro atribuímos um valor vazio à variável Foo e verifique se ele está realmente vazio. Em seguida, realizamos um if com o comando composto ((foo = 5
)). Este processo faz duas coisas interessantes: 1) atribui o valor 5 à variável
foo e 2) é avaliado como verdadeiro porque foo foi atribuído a um valor diferente de zero.
Nota: É importante lembrar o significado exato do = na expressão acima. Um único = executa atribuição. fo = 5 diz “fazer Foo igual a 5, ”enquanto == avalia a equivalência. fo == 5 diz “faz Foo igual a 5? ” Este é um recurso comum em muitas linguagens de programação. No shell, isso pode ser um pouco confuso porque o teste comando aceita um único = para equivalência de string. Mais uma razão para usar o mais moderno [[]] e (()) comandos compostos no lugar de teste.
Além do =, o shell também fornece notações que realizam algumas atribuições muito úteis:
Tabela 34-4: Operadores de atribuição
Descrição da notação
Descrição da notação
parâmetro = valor Atribuição simples. Atribuições valor para parâmetro.
parâmetro += valor Adição. Equivalente a parâmetro = parâmetro +
valor.
parâmetro -= valor Subtração. Equivalente a parâmetro = parâmetro -
valor.
parâmetro *= valor Multiplicação. Equivalente a parâmetro = parâmetro
* valor.
parâmetro /= valor Divisão inteira. Equivalente a parâmetro =
valor do parâmetro.
parâmetro %= valor Módulo. Equivalente a parâmetro = parâmetro %
valor.
parâmetro++ Variável pós-incremento. Equivalente a parâmetro =
parâmetro + 1 (no entanto, consulte a discussão abaixo).
parâmetro−− Variável pós-decremento. Equivalente a parâmetro =
parâmetro - 1.
++parâmetro Pré-incremento variável. Equivalente a parâmetro =
parâmetro + 1.
--parâmetro Pré-decremento variável. Equivalente a parâmetro =
parâmetro - 1.
Esses operadores de atribuição fornecem um atalho conveniente para muitas tarefas aritméticas comuns. De especial interesse são o incremento (++) e decremento (−−) operadores, que aumentam ou diminuem o valor de seus parâmetros em um. Este estilo de notação é retirado da linguagem de programação C e foi incorporado em uma série de outras linguagens de programação, incluindo bater.
Os operadores podem aparecer na frente de um parâmetro ou no final. Embora ambos aumentem ou diminuam o parâmetro em um, os dois posicionamentos têm uma diferença sutil. Se colocado na frente do parâmetro, o parâmetro é incrementado (ou decrementado) antes de o parâmetro ser retornado. Se colocado depois, a operação é realizada depois de o parâmetro é retornado. Isso é bastante estranho, mas é o comportamento pretendido. Aqui está uma demonstração:
[me @ linuxbox ~] $ foo = 1 [me @ linuxbox ~] $ echo $ ((foo ++)) 1
[me @ linuxbox ~] $ echo $ foo
[me @ linuxbox ~] $ foo = 1 [me @ linuxbox ~] $ echo $ ((foo ++)) 1
[me @ linuxbox ~] $ echo $ foo
2
2
Se atribuirmos o valor de um à variável Foo e então incrementar com o ++ operador colocado após o nome do parâmetro, Foo é retornado com o valor de um. No entanto, se olharmos para o valor da variável uma segunda vez, vemos o valor incrementado. Se colocarmos o ++ operador na frente do parâmetro, obtemos o comportamento mais esperado:
[me @ linuxbox ~] $ foo = 1 [me @ linuxbox ~] $ echo $ ((++ foo)) 2
[me @ linuxbox ~] $ echo $ foo
2
[me @ linuxbox ~] $ foo = 1 [me @ linuxbox ~] $ echo $ ((++ foo)) 2
[me @ linuxbox ~] $ echo $ foo
2
Para a maioria dos aplicativos de shell, prefixar o operador será o mais útil.
Os operadores ++ e - são freqüentemente usados em conjunto com loops. Faremos algumas melhorias em nosso script de módulo para torná-lo um pouco mais restrito:
#! / Bin / bash
# módulo2: demonstra o operador de módulo para ((i = 0; i <= 20; ++ i )); Faz
E se (((i% 5) == 0)); então printf "<% d>" $ i
outro
printf "% d" $ i
fi feito
printf "\ n"
#! / Bin / bash
# módulo2: demonstra o operador de módulo para ((i = 0; i <= 20; ++ i )); Faz
E se (((i% 5) == 0)); então printf "<% d>" $ i
outro
printf "% d" $ i
fi feito
printf "\ n"