bashでコマンドライン引数にファイルの中身を渡す

標準出力先としてファイル名を指定するのではなく、ファイルの中身(body)を引数として渡すにはどうすればよいのか?

実験用スクリプト

確認のため、次の簡易的なシェルスクリプトで各コマンドライン引数を表示させる。

#!/bin/bash
# test.sh — just dump arguments

for i; do
  echo $i;
done

入力ファイルとしては次のように改行やスペースを含んだ JSON ファイルを渡す

$ cat test.json
{
  "firstName": "John",
  "age": 25,
  "address": {
    "state": "NY",
    "postalCode": "10021-3100"
  }
}

実行コマンド

結果論としては、以下のように printfcat をコンボすればよい

$ ./test.sh foo $(printf '%s' $(cat test.json)) bar
foo
{"firstName":"John","age":25,"address":{"state":"NY","postalCode":"10021-3100"}}
bar

解説

ポイントとなるのは次の箇所

$(printf '%s' $(cat test.json)) 

ここを単純に $(cat test.json) や bash 方言のショートカットである $(< test.json) とすると、改行・スペースを引数の区切りとしてみなされてしまう

$ ./test.sh foo $(cat test.json) bar
foo
{
"firstName":
"John",
"age":
25,
"address":
{
"state":
"NY",
"postalCode":
"10021-3100"
}
}
bar

この問題を回避するために、ファイルの中身全体を1文字列として扱うために printf '%s' でラップさせるというわけ。

Reference

Advertisements
Tagged with: , , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: