Hatena::ブログ(Diary)

Magical Diary このページをアンテナに追加 RSSフィード

2011年01月04日

シェルスクリプト中で連番を得る

先日、IRCNet #ruby:*.jp で話題になったのでメモ

シェルスクリプト中で連番や複数回の繰り返しが必要になった場合BSD系 (4.2BSD以降・Mac含む) では jotGNU系では seq を使うことが多い。が、普通は片方しか入っていないし、互換性も全く無いというやっかいな代物。

jot 回数

jot 回数 開始

jot 回数 開始 終了

jot 回数 開始 終了 増加

seq 終了

seq 開始 終了

seq 開始 増加 終了

awk

awk を使って出力すればどうかということになるが、以下の書き方ではSolarisでは標準入力オープンしてしまうため期待通りに動作しないらしい。*1

% awk 'BEGIN { for(i = 0; i < 10; i++) { print i } }'

この場合、/dev/null を読ませるようにしてこのようにすればSolarisでも動作するようだ。*2

% awk 'BEGIN { for(i = 0; i < 10; i++) { print i } }' /dev/null

expr

もしくは、expr でがんばる?

getseq()
{
  i=$1
  END=$2
  while [ "$i" -lt "$END" ]; do
    echo $i
    i=`expr "$i" + 1`
  done
}

POSIX shellだと、exprの代わりに$((expr)) を利用出来るようだ。かなり古いFreeBSD/bin/shでも利用出来たし、もう移植性のある方法と言って差し支えないのかもしれない。

でも…

もうPerlでいいような気もしてきた。大抵どこにでもあるし。

% perl -e 'print "@{[0..9]}\n"'

*1http://ya.maya.st/d/200611b.html#s20061116_2

*2:手元に環境がないので試していない。

DQNEODQNEO 2011/06/12 23:55 初心者向けにわかりやすく書くなら、

% perl -e 'print join " ", (0..9), "\n"'

DQNEODQNEO 2011/06/12 23:58 シジルとリファレンスがない分、Perl苦手な人にもわかりやすいと思った次第です。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。