質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

2回答

14200閲覧

ヒアドキュメントにおける変数展開について

hirhir

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

2グッド

0クリップ

投稿2017/02/02 01:04

ヒアドキュメントについて質問です。
以下のようにヒアドキュメントにfor文を記載したのですが、どうも変数がうまく展開されていないようです。どなたか、原因や対処法をお知りの方ご教授いただけないでしょうか??

bash

1$ /bin/bash <<EOF 2> for var in a b c; do 3> echo ${var} 4> done 5> EOF 6 7 8$ 9

ちなみに変数展開が原因だと判断した理由は、以下のように修正すると"hello"が3回出力されているからです。

bash

1$ /bin/bash <<EOF 2> for var in a b c; do 3> echo "hello" 4> done 5> EOF 6hello 7hello 8hello 9

よろしくお願いします。

Y.H., ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

変数varが展開されるタイミングがビアドキュメントで記述した時点で展開されるからです。

bash

1$ export var=foobar 2$ /bin/bash <<EOF 3> for var in a b c; do 4> echo ${var} 5> done 6> EOF 7foobar 8foobar 9foobar

bashに渡されるヒアドキュメントに記述したスクリプトは以下となります。

bash

1for var in a b c; do 2echo foobar 3done

これを解決するには以下のようにしてください。<<EOFではなく<<'EOF'

bash

1export var=foobar 2/bin/bash <<'EOF' 3for var in a b c; do 4echo ${var} 5done 6EOF 7a 8b 9c

この場合、bashに渡されるヒアドキュメントに記述したスクリプトは以下となります。

bash

1for var in a b c; do 2echo ${var} 3done

補足

bashのマニュアルの<<'EOF'該当部は以下です。が文章がわかり辛いので(Qiita)bashのヒアドキュメントを活用するを読んでいただければと思います。

$ man bash
ヒアドキュメントの形式を以下に示します:

<<[-]word here-document delimiter word に対するパラメータ展開・コマンド置換・算術式展開・パス名展開は全く 行 わ れません。 **word が一部でもクォートされている場合**は、 delimiter は word のクォートをほどいた結果 (クォート文字を削除した結果) となり、 **ヒアド キュメントに含まれる行では展開が行われなくなります**。

投稿2017/02/02 01:44

編集2017/02/02 02:06
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

bash

1$ /bin/bash << EOF 2> for var in a b c; 3> do 4> echo \${var} 5> done 6> EOF 7a 8b 9c

と、$ をクオートしてやらねばならないようです。

日本語訳版の bash マニュアルのヒアドキュメントの項によれば、

word に対するパラメータ展開・コマンド置換・算術式展開・ パス名展開は全く行われません。 word が一部でもクォートされている場合は、 delimiter は word のクォートをほどいた結果 (クォート文字を削除した結果) となり、 ヒアドキュメントに含まれる行では展開が行われなくなります。 word がクォートされていなければ、 ヒアドキュメント中の全ての行に対して パラメータ展開・コマンド置換・算術式展開が行われます。 word がクォートされていない場合には、 <newline> という文字列は無視され、 , $, ` といった文字は \ を用いてクォートしなければなりません。

となっています。

投稿2017/02/02 01:41

編集2017/02/02 01:42
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問