A sintaxe padrão (POSIX) sh
, que deve funcionar em qualquer implementação conforme as versões recentes de dash
, seria:
#!/bin/sh -
reg=0x000000
done=0x4A9FFF
while [ "$((reg))" -le "$((done))" ]; do
reg=$((reg + 1))
printf 'wm8280_reg get 0x%06X\r\n' "$reg"
sleep 1
done
Se você precisar ser portável para versões de dash
anteriores a 0.5.5 (2009), será necessário:
#!/bin/sh -
reg=0x000000
done=0x4A9FFF
while [ "$(($reg))" -le "$(($done))" ]; do
reg=$(($reg + 1))
printf 'wm8280_reg get 0x%06X\r\n' "$reg"
sleep 1
done
A especificação POSIX costumava não ser muito clara sobre como o $((reg))
deveria ser expandido (ainda não está muito claro no texto, mas pelo menos a posição do Open Group foi esclarecida na lista de discussão e no suite de testes de conformidade) e dash
usado para não suportar variáveis simples (sem $
) em suas expressões aritméticas, enquanto a especificação para "$(($ver))
sempre foi muito mais clara.
Observe que $reg
será decimal após a primeira invocação de reg=$(($reg + 1))
, portanto você também pode converter as variáveis em decimais no início. Observe também que ele imprimirá números 0 x 1 a 0 x 4AA000 (56 dias depois); uma maneira mais convencional (e legível de IMO) de escrevê-lo seria:
#!/bin/sh -
reg=$((0x000001)) done=$((0x4AA000))
while [ "$reg" -le "$done" ]; do
printf 'wm8280_reg get 0x%06X\r\n' "$reg"
sleep 1
reg=$(($reg + 1))
done
Além disso, não espere imprimir uma linha exatamente a cada segundo. Haverá um desvio causado pelo tempo gasto na execução desses comandos.
Detalhes:
-
export
é exportar variáveis para o ambiente de comandos a serem executados. Não faz sentido usá-lo aqui. Essas variáveis são usadas aqui apenas para passar seu valor como argumento para comandos. - Você coloca
$
na frente de uma variável quando deseja que o valor seja expandido.export $reg=0x000000
executaria umexport value-of-reg=0x000000
. -
while
é seguido por um comando (ou uma lista de comandos) para executar cujo status de saída determina a condição do loop. Aqui, precisamos do comando[
(construído na maioria das shells) que pode ser usado para executar vários tipos de testes, como as comparações de inteiros. - esses operadores de comparação aritmética de
[
suportam apenas constantes inteiras decimais, portanto usamos as expansões aritméticas do shell (que suportam hexadecimais) para convertê-las em decimais. - cosmético: por convenção, geralmente usamos nomes de variáveis maiúsculas para variáveis de ambiente ou variáveis que devem ter um escopo global em um script complexo que usa funções por exemplo.