コマンドライン引数からランダムに 1 つを返す

サイコロコマンド - コマンドライン引数からランダムに1つ返すコマンド - みずぴー日記 からですが、難しいわけではないものの awk でも ARGC の取扱いは注意が必要な項目の一つではないでしょうか。

それは ARGC は 0 からはじまって、引数の数 + 1 までの値がセットされますが、配列 ARGV の要素は 0 から引数の数 (ARGC - 1) の値が格納されます。 しかも ARGC が 0 の時の配列 ARGV は何が格納されるかはシステムに依存するというので注意が必要です。

このような注意をしておけば、プログラム自体は簡単です。

#! /usr/local/bin/nawk -f
# argv_dice.awk
# コマンドライン引数からランダムに 1 つ返すコマンド
# usage: nawk -f argv_dice.awk argvs

BEGIN {
    srand();

    print ARGV[random(ARGC - 1)];
}

# random():     1 から num までの整数の乱数を返す
#   in:     数値 num
#   out:    1 から num までの整数の乱数
function random(num) {
    return int(rand() * num + 1);
}

実行してみましょう。

$ nawk -f argv_dice.awk A B C
A

$ nawk -f argv_dice.awk A B C
C

ちなみに ARGC が 0 の時の配列 ARGV の値は以下のようになり、結果的に awk の実行コマンドを返すことが通常のようです。

$ nawk 'BEGIN{print ARGV[0]}'
nawk

$ mawk 'BEGIN{print ARGV[0]}'
mawk

$ busybox awk 'BEGIN{print ARGV[0]}'
awk

$ gawk 'BEGIN{print ARGV[0]}'
gawk

$ xgawk 'BEGIN{print ARGV[0]}'
xgawk

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png