seq
não é interno. Também não faz parte do padrão Posix. Mas as implementações usuais de seq
não têm nenhuma capacidade de sequenciar em bases diferentes de 10.
No bash, você pode especificar um intervalo como {start..finish}
. No entanto, isso também não funciona em bases diferentes de 10 (embora funcione com letras: {a..f}
expande para a b c d e f
.
E, tanto quanto eu sei, é isso para geradores de sequência simples, o que deixa você com algumas possibilidades.
A maneira tola de fazer isso é filtrar os valores não binários. Isso é simples, mas extremamente ineficiente se a
e b
não forem minúsculos:
for x in $(seq -w $a $b); do
if [[ ! ($x =~ [2-9]) ]]; then
echo $x
fi
done
Aqui está uma solução melhor. Assumindo que a
e b
tenham o mesmo tamanho (se não, você pode usar printf para corrigir isso), o seguinte irá percorrer todos os números binários de a para b, inclusive:
# We need a string of 0s at least as long as a:
z=${a//1/0}
while [[ ! ($a > $b) ]]; do
# do something with $a
# The following "increments" a by removing the last 0 (and trailing 1s)
# and replacing that with a 1 and the same number of 0s.
a=$(printf "%.*s" ${#a} ${a%0*}1$z)
done