Shellscriptでランダムなカラーコード生成
/dev/urandom でランダムなカラーコードを簡単に生成できる!こんなシェルスクリプトで.
# get 4 byte random numbers in base 16 random=`od -An -N4 -tx < /dev/urandom` # cut out subtext from 1 to 6 color=`echo $random | cut -c 1-6`
od は octal dump の頭文字から名付けられたコマンドで,8進数でバイナリをダンプするコマンド (何言ってるのか僕は分かってない).でも8進数以外の出力にも使える.
cut コマンドは簡単なのでここでは説明を省略することにして, od の使い方を見てみよう.od コマンドに与えてるそれぞれのオプションを簡単に説明しよう.僕はこのページを参考にしました.
ここ以降で od の使い方を説明してるけど,od への入力を与えてる /dev/urandom についても知っておくといいと思う.それについても記事を書いてるから読んでね.
-An
-A で出力の先頭に付加されるファイルオフセット (行番号みたいなもの?) を設定.n は「表示しない」という設定.他のオプションは次の通り.
| オプション | 意味 |
|---|---|
n | 非表示 |
d | 10進数で表示 |
o | 8進数で表示 |
x | 16進数で表示 |
$ od -An -N32 -tx < /dev/urandom 33b12b5c 9c399d71 042f32a6 33bff2bc 41f072a2 2611c972 0adf07d2 ef7a4e4f $ od -Ad -N32 -tx < /dev/urandom 0000000 cc2271ec 8e0f2d66 cc6584fb cd1e346d 0000016 f4893caf d85c5f96 fc30d6e9 642844b1 0000032 $ od -Ao -N32 -tx < /dev/urandom 0000000 74cda3ca c327ddec dc359288 d29bff20 0000020 e7bd6695 19e24a99 a3f5cd23 b89ec0c3 0000040 $ od -Ax -N32 -tx < /dev/urandom 000000 2a83421f 89c4b676 8ba7043d 04efc44b 000010 692063c8 5efbcbd6 ec77bd04 7d45c900 000020 $ od -N32 -tx < /dev/urandom 0000000 b5070e17 5309fdf2 0a2dd925 208f0334 0000020 705856f8 ba807a50 f746eb4d 4ce7aced 0000040
-A オプションを指定しないときの,デフォルトの動作はどうやら -Ao を指定したときの挙動のようですね.
-N4
入力データの先頭を切り出してダンプするときのオプション.-N のあとに入力された数のバイト分だけ,入力の先頭を読み込んでダンプする.今回の入力は /dev/urandom という無限に続く乱数列なので,-N オプションで切らないと出力が終わらない笑.
今回 -N4 を選んだのは,僕はこの乱数をカラーコードに使いたかったら.カラーコードは16進数を6桁 (アルファチャンネルは考えてない) なので,(2⁴)⁶ = (2⁸)³ ,つまり3バイトあれば足りる.実際 $ od -An -N3 -tx < /dev/urandom の出力はこんな感じ.
$ od -An -N3 -tx < /dev/urandom 00cbe8f0
これの下6桁を切り出せばカラーコードに使えるね.でもシェルスクリプトで「右から6文字」を切り出す簡単なコードが見つからなかったので,-N4 で4バイト出力してもらって,その先頭の6文字を切り出すことにしたのでした.
$ od -An -N4 -tx < /dev/urandom 2cfa6e6d
-tx
-t は出力のフォーマットを決めるためのオプションで,x は16進数で出力してねという指定.他にも色々あるらしいので試してみましょうか.
| オプション | 意味 |
|---|---|
a | 文字名。最上位ビットは無視される |
c | 表示可能文字または \ エスケープ文字 |
d | 符号付き 10 進数 1 整数 (integer) のサイズ指定 |
f | 浮動小数点 1 整数 (integer) のサイズ指定 |
o | 8 進数 1 整数 (integer) のサイズ指定 |
u | 符号なし 10 進数 1 整数 (integer) のサイズ指定 |
x | 16 進数 1 整数 (integer) のサイズ指定 |
$ od -An -N4 -ta < /dev/urandom
rs G V Z
$ od -An -N4 -tc < /dev/urandom
260 305 ^ 213
$ od -An -N4 -td < /dev/urandom
-1394728534
$ od -An -N4 -tf < /dev/urandom
1.450007353e-314
$ od -An -N4 -to < /dev/urandom
03465511161
$ od -An -N4 -tu < /dev/urandom
1294518198
$ od -An -N4 -tx < /dev/urandom
1c26865d
$ od -An -N4 < /dev/urandom
122521 041371
-t オプションを指定しないときの挙動はどれだ?よく分からん…
od には他にもいくつかオプションがあって複雑だけど,/dev/urandom と組み合わせて遊ぶ分にはこれくらいの知識でいいかな?

2件のフィードバック