DT日記

家を離れた自宅警備員の日記

コマンドラインで乱数

どうも、自宅警備員です。

コマンドラインからささっと乱数を生成したいときにべんりかもしれないシェル函数Rubyワンライナーを書いたので宣伝しませう*1。シェルは Bourne shell っぽいやつなら sh でも bash でも dash でも ash でも、そして zsh でも大丈夫ですね。

使ひ方は、一番お手軽には $HOME/.bashrc とか $HOME/.zshrc の最後の方に書き足してやるのが良いですね。ほんとは . / source コマンドで読み込んでみるのが良い気がします。

rand

えっと、一往ここにもコード載せますが、 Gist の方が最新である可能性が高いですね。

要するに RubySecureRandom を叩いてるだけなので、Ruby のドキュメントとシェルスクリプト本文を読むのがてっとりばやい気がします!

rand () {
    a=$1
    b=$2
    type=random_string
    len=10
    post="cat -"
    chop="sed -e s/.$//g"
    case `echo $a | tr '[:upper:]' '[:lower:]'` in
        "")  a=$type; b=$len ;;
        ba*) a=base64        ;;
        f*)  a=random_float  ;;
        h*)  a=hex           ;;
        b*)  a=random_bytes  ;;
        u*)  a=uuid          ;;
        s*)  a=random_string ;;
        n*)  a=random_number ;;
    esac
    if test "$a" = uuid
        then type=uuid; len=''
    elif test "$a" = random_float
        then type=random_number; len=0
    elif test "$a" = random_string -o "$b" = ""
    then
        type=hex
        test ! "$b" && l=$a
        if test "$b" -gt 0 2>/dev/null
            then l=$b
        fi
        len=`expr $l / 2`
        mod=`expr $l % 2`
        if test "$l" = 1
            then post="$chop"; len=1
        elif test $mod = 1
            then post="$chop"; len=`expr $len + 1`
        fi
    elif test "$a" -a "$b"
        then type=$a; len=$b
    elif test "$a"
        then len=$a
    fi
    ruby -rsecurerandom -e "puts SecureRandom.${type} ${len}" | eval $post
}

どうせ一回は ruby を起動するんだから全部 Ruby で書きゃ良かったんじゃないかって気もなきにしもあらずなのですが、単純なものならシェルスクリプトもお手軽に書けて大好きです。

rand とだけ叩いてやれば10文字のそれっぽい文字列が出てきますし、 rand 20 と叩いてやれば20文字で出てきます。 rand float とか rand f とか書いてやれば、1未満の浮動小数点数が出てきます。 rand byte 10 とかやると10バイトのバイト列が出てきます! その他はコード読んでください!

*1:ただし最後にアップデートしたのは21日前…