2011年01月04日
■シェルスクリプト中で連番を得る
先日、IRCNet #ruby:*.jp で話題になったのでメモ。
シェルスクリプト中で連番や複数回の繰り返しが必要になった場合、BSD系 (4.2BSD以降・Mac含む) では jot、GNU系では 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"'
トラックバック - http://d.hatena.ne.jp/hirata_yasuyuki/20110104/sequential_numbers
リンク元
- 826 http://pipes.yahoo.com/pipes/pipe.info?_id=3eebace824bb60a10f13c841c2c64478
- 584 http://www.st.ryukoku.ac.jp/~kjm/security/memo/
- 285 http://www.st.ryukoku.ac.jp/~kjm/security/memo/2011/01.html
- 81 http://longurl.org
- 81 http://twitter.com/
- 29 http://twitter.com/kunihirotanaka/status/21764987865272321
- 25 http://www.upken.jp/kb/servers_man_vps_problem.html
- 20 http://reader.livedoor.com/reader/
- 19 http://d.hatena.ne.jp/
- 18 http://ime.nu/d.hatena.ne.jp/hirata_yasuyuki/20110101/dti_vps_open_proxy
