💡

zshでHeredoc構文を使ってコマンド引数を渡す方法

2024/07/02に公開

実現したいこと

以下の内容をsqlite-utils CLIツールに引数として渡したい。

insert into documents select
  substr(s3_ocr_etag, 1, 4) as id,
  key as title,
  key as path,
  replace(s3_ocr_etag, '"', '') as etag
from
  index2.ocr_jobs;

問題点

この中にはシングルクオートとダブルクオートの両方が含まれているため、文字列のエスケープが少し厄介です。。。

解決策

Heredoc構文を使います(Bashとzshの両方で可)

sqlite-utils sfms.db --attach index2 index.db "$(cat <<EOF
insert into documents select
  substr(s3_ocr_etag, 1, 4) as id,
  key as title,
  key as path,
  replace(s3_ocr_etag, '"', '') as etag
from
  index2.ocr_jobs;
EOF
)"

これを分解すると、主なポイントはcat <<EOF ... EOFを使ってリテラルのテキストを包むことです:

$(cat <<EOF
insert into documents select
  substr(s3_ocr_etag, 1, 4) as id,
  key as title,
  key as path,
  replace(s3_ocr_etag, '"', '') as etag
from
  index2.ocr_jobs;
EOF
)

そして、これをsqlite-utilsコマンドの引数として渡すために、"$(cat ...)"を使います。この"があることで、zshやbashがその入力内のトークンを別々の引数として扱わないようにしています。

フリーランスエンジニア必見!

最後に、フリーランスエンジニアの方にご案内です。
あなたに今だけご紹介できる限定の案件があります!

気になる方は公式ラインの追加をお願いします👇
https://bit.ly/3xLrLGw

Discussion