試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Bシェルのシェルスクリプトの中で標準入力全体を扱う

Bシェル(bashやdash,zsh)のシェルスクリプトの中で

  • 変数IFSを空文字列にする
  • readコマンド(関連記事)をループで実行し、ループの中では読み込んだ変数の内容をechoでそのまま出力
  • ループ末尾の「done」の後ろに「| [コマンド行]」を(必要な分だけ)付ける

とすることで、標準入力全体を別のコマンドに渡すことができる。

#! /bin/sh
IFS=
while read L; do echo ${L}; done | [コマンド行] | [コマンド行] | ...

  1. 例1: 標準入力の内容をXZ圧縮しつつBase64エンコードして標準出力に出力
  2. 例2: 標準入力の先頭3行と末尾3行を表示
  3. 実行例

例1: 標準入力の内容をXZ圧縮しつつBase64エンコードして標準出力に出力

[任意]ファイル名: stdin-xz-base64.sh

#! /bin/sh
IFS=
while read L; do echo ${L}; done | xz | base64

例2: 標準入力の先頭3行と末尾3行を表示

[任意]ファイル名: stdin-head-and-tail.sh

#! /bin/sh
IFS=
echo "---------------- head ------------------"
while read L; do echo ${L}; done | head -n 3
echo "---------------- tail ------------------"
while read L; do echo ${L}; done | tail -n 3

実行例

例1と例2の両方を用いる流れで実行テストを行う。

(「seq 100000」の結果をXZ/Base64変換してファイルに書き出す)
$ seq 100000 | [stdin-xz-base64.shの場所] > test.xz.b64

(Base64デコードとXZ伸長後に先頭/末尾各3行を表示)
$ base64 -d test.xz.b64 | unxz | [stdin-head-and-tail.shの場所]
---------------- head ------------------
1
2
3
---------------- tail ------------------
99998
99999
100000