seqによる数の減算(デクリメント)時の注意点

seqによる数の減算(デクリメント)時の注意点

seqを使ったデクリメントはローテート処理を自作する場合などに便利です。ただBSDとgnuのseqでは動作が微妙に違うのでスクリプト化するときには注意が必要です。

インクリメントの動作チェック

先にインクリメントの動作を確認してみます。

% seq 1 3
1
2
3
% gseq 1 3
1
2
3

両者とも特に違いはありません。

デクリメントの動作チェック

今度はデクリメントの動作をチェックしてみます。

% seq 3 1
3
2
1
% gseq 1 3
%

BSDのseqはこの記述でも問題ありません。実際BSD seqのmanでもこの記述が載っています。しかしgnuのseqでは何も表示されません。

スポンサーリンク
スポンサーリンク

gnu seqでデクリメント

gnuのseqで減算してみます。

% gseq 3 -1 1
3
2
1

gnu seqの場合は、スタートの数値と最後の数値の間に、減算数を指定する必要があります。

$ seq first increment last

BSD seq で同様に

この記述はBSD seqでも同様に使えます。

% seq 3 -1 1
3
2
1

加算時のインクリメントの指定

加算時にもインクリメントの指定が可能です。これは1以外の加算時に利用するケースが多いかと思います。

% seq 1 2 10
1
3
5
7
9
% gseq 1 2 10
1
3
5
7
9

応用例

これはバックアップファイルをローテートさせる場合などに使えます。例えばこういった感じでバックアップファイルのローテートを行いたい場合

bkup (最新)
bkup.0 (1世代前)
bkup.1 (2世代前)
bkup.2 (3世代前)
bkup.3 ...
bkup.4 ...
bkup.5 ...

下記のように記述します。

BKFILE="バックアップファイル名"

for i in `seq 4 -1 0`
  do
    if [[ -e $BKFILE.$i ]]; then
      mv $BKFILE.$i $BKFILE.$((i + 1))
    fi
done

if [[ -e $BKFILE ]]; then
  mv $BKFILE $BKFILE.0
fi

# 以下にバックアップ処理を記述
tar czf $BKFILE ./

まとめ

gnu seq利用時に、安易に例えば "seq 3 0" といった記述を書くと動かなくなるので注意が必要です。Macでは動くけれどLinuxでは動かないといった事が起こります。より汎用性の高いスクリプトを書く為に押さえておくべきポイントかと思います。

スポンサーリンク
スポンサーリンク