0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Bourne/Ash shell(shシェル)で複数行をヒアドキュメントで変数に代入する

Last updated at Posted at 2019-05-30

Here Documents on Bourne/Ash Shell (not bash)

スクリプトを bash シェル でなく sh シェルBourne shell, ボーンシェル)互換で書くと、たいていの Linux ディストーションで動くと聞いた。

shシェル で**ヒアドキュメントを使って複数行を変数に代入できるか**知りたい。

TL;DR

ヒアドキュメントの変数代入は sh シェルでも動きます。System7 の頃からできるんです。

VAR=$(cat <<HEREDOC
one
two
three
HEREDOC
)
別のシェルからshシェルに渡して実行する方法
$ echo $SHELL
/bin/bash
$ # sh シェルで実行させる
$ /bin/sh <(cat sample_script.sh)

Qiita 記事を「shシェル 複数行 変数 代入 ヒアドキュメント」とググってbash シェルばかり。タイトルからわかる sh シェルの場合の記事がすぐに出てこなかったので自分のググラビリティとして。

TS;DR

Docker イメージ内で使うシェルスクリプトを組むとき、alpine などは ashsh 系シェルであるため bash のシェルスクリプトだと動かないことが、まれに多くあります。

まぁ、「やってみろ」って話しなんですが、、、Mac のように sh のつもりが実は bash のエイリアスになっていたりするので、確信が持てなかったのです。そもそも bash の場合でも構文を忘れてしまうし。。。

そこで、Docker のイメージでもシンプルで基本的な alpinebusyboxashシェル) のベースイメージで動作するか試してみました。

$ # スクリプトの中身
$ cat ./sample_heredoc.sh
# /bin/sh

VAR=$(cat <<'HEREDOC'
abc'asdf"
$(dont-execute-this)
foo"bar"''
HEREDOC
)
echo "$VAR"

$ # busybox で実行
$ docker run --rm -v $(pwd)/sample_heredoc.sh:/sample.sh busybox /sample.sh
one
two
three
$ # Alpine Linux で実行
$ docker run --rm -v $(pwd)/sample_heredoc.sh:/sample.sh alpine /sample.sh
one
two
three

しかし、「そもそも System7 時代からヒアドキュメント使えるよ」と Bourne Shell の Wikipedia に載ってました。。。あちょんぶりけ

UNIX Version 7 での Bourne Shell の機能と特徴を以下に挙げる:

  • ...
  • << を使ったヒアドキュメント(Here documents)機能。スクリプト内に埋め込まれたテキストブロックを入力として使う。
  • ...

(「機能と特徴」| Bourne Shell @ Wikipedia より)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?