改行やその他の特殊文字を使用してファイルの内容を環境変数に設定し、埋め込み変数を解釈します。

改行やその他の特殊文字を使用してファイルの内容を環境変数に設定し、埋め込み変数を解釈します。

改行と特殊文字を含むファイルから環境変数を作成したいことを考えると、次のようになります。手がかりは、コンテンツが解釈される必要がある他の環境変数を参照できることです。たぶん普通のbashよりも洗練されたものが必要かもしれません。

テストファイル「testfile.txt」は次のようになります。

* foo
\/-!~ 
FOO=${FOOBAR}

これまで私が直接管理した内容は次のとおりです。

#!/bin/bash
FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"
content="$(<$file)"
echo "$content"

これは私に出力としてコンテキスト変数を提供します(したがって正確にファイルの内容)。

* foo
\/-!~
FOO=${FOOBAR}

しかし、どうすればいいですか?

  1. ${FOOBAR}を上記で定義した「SUCCESS」に設定し、残りはそのままにしますか?
  2. 内容が(1)の環境変数TESTを設定しますか?

ベストアンサー1

この回答は許可された回答に基づいて調整されました。https://stackoverflow.com/questions/10683349/forcing-bash-to-expand-variables-in-a-string-loaded-from-a-file

#!/bin/bash
export FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"

content="$(envsubst < "$file")"
echo "$content"

eval単に変数を変更するのとは異なり、envsubstコマンドの置き換えや同様の手段で他のプログラムを実行する危険はありません。これは非常にシンプルなシェルテンプレートツールです。

envsubstgettext-baseGNU gettext国際化ユーティリティの一部です(Debianではパッケージにあります)。

envsubst(シェルに組み込まれていない外部コマンドで)エクスポートされた変数のみを表示できます(ただし、シェルに後で定義された変数を環境にエクスポートさせるには、標準オプションを参照してください)allexportsh

おすすめ記事