Bash:制御値をバイナリに保つバイナリ範囲を持つForループ

Bash:制御値をバイナリに保つバイナリ範囲を持つForループ

バイナリ値を含む2つのbash変数があるとします。

a=0011 # decimal 3
b=1000 # decimal 8

$a可能なすべての値を繰り返し$bバイナリに保つ方法はありますか?それは次のとおりです。

for blah in $(seq $a $b) ; do
    print "Blah is: $blah"
done

したがって、次のように出力されます。

Blah is: 0011
Blah is: 0100
Blah is: 0101
Blah is: 0110
Blah is: 0111
Blah is: 1000

私は試した:

for blah in $(seq "$((2#$a))" "$((2#$b))") ; do

しかし、$blah10進数になり、2進数で維持したいと思います。 (いつでも10進数を2進数に変換できますが、すでに厳しいバイナリ)

コードは限られたLinux(オープンWRT)使用できませんobase。答えがこの場合バイナリ値を保存することは不可能です、これはまた便利な答えです(を使用せずに10進数を2進数に変換する関数を作成することができますobase)も一般的ですbash

ベストアンサー1

あなたはこれにかなり近いです:

for blah in $(seq "$((2#$a))" "$((2#$b))") ; do

for同様の方法を使用して、ループ内の10進値を再び2進数に変換しますdc

はい

$ for blah in $(seq "$((2#0011))" "$((2#1000))"); do \
     printf "%04d\n" $(echo "obase=2;$blah" | bc);done
0011
0100
0101
0110
0111
1000

printf前にゼロが埋め込まれ、特定の幅にフォーマットされているように出力を制御するために使用されます。パラメーターは%04d出力内容を指定します。

このコマンドのもう1つの重要な点は、bcコマンドライン電卓を使用することです。このコマンドの例は次のとおりです。

echo "obase=2;$blah" | bc

を使用して値を取得し、$blah2進数(2進数とも呼ばれる)に変換しますbc

BCまたはDCなし

これらのツールがまったく存在しないように制限されたシステムを使用している場合は、awkマニュアルのこの機能を直接使用して変換できます。awk

はい

次の内容でファイルを作成し、名前をdec2bin.awk

# bits2str --- turn a byte into readable 1's and 0's

function bits2str(bits, data, mask)
{
    if (bits == 0)
        return "0"

    mask = 1
    for (; bits != 0; bits = rshift(bits, 1))
        data = (and(bits, mask) ? "1" : "0") data

    while ((length(data) % 8) != 0)
        data = "0" data

    return data
}

{
  printf("%s\n", bits2str($1))
}

さて、上記の機能を使用してください。

$ for blah in $(seq "$((2#0011))" "$((2#1000))"); do echo $blah \
     | awk -f dec2bin.awk; done
00000011
00000100
00000101
00000110
00000111
00001000

おすすめ記事