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

Last modified: 2021-08-01

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

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

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

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

例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