67

envsubstの代入を防ぐ方法はあり$VARIABLEますか? たとえば、次のようなものを期待します。

export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst

そして返してもらう

dont substitute $THIS

しかし、代わりに私は得る

dont substitute \THAT

これを行うためのエスケープ文字はありますか?

4

9 に答える 9

79

envsubst変数のリストを指定すると、それらの変数のみが置換され、の置換は無視されます。それがどのように機能するのか正確にはわかりませんが、次のようなものがあなたが望むことをするようです:

$ export THIS=THAT FOO=BAR
$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
dont substitute $THIS but do substitute BAR

$THISはそのままですが、$FOOに置き換えられていることに注意してくださいBAR

于 2014-07-25T20:43:57.557 に答える
14
$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \$SHELL | envsubst 
/bin/bash
$ echo \$\${q}SHELL | envsubst 
$SHELL

そうすることで、キャラクター$$を追加することができます。$次に、存在しない変数を「置換」するだけです(ここでは使用${q}しましたが、より意味のあるものにすることができ、${my_empty_variable}必要なものが得られます.

段落の解決策と同じように、何か特別なものが必要です-ここでは... 存在しない変数です。これは、テンプレートで追加の sed を実行するよりも少し好きです。

于 2020-04-16T20:51:53.110 に答える
1

gettextこれは、 1 つのプログラムのパッケージ全体をインストールする手間を省くため、私が使用する代替手段です。私はこの awk スクリプトを持っていenvtmplます{{ENV-VAR}}ENV-VAR

#! /usr/bin/awk -f
{ for (a in ENVIRON) gsub("{{" _ a _ "}}",ENVIRON[a]); print }

そう

$ echo "My shell '{{SHELL}}' is cool" | envtmpl
My shell '/bin/bash' is cool

ご覧のとおり、{{&}}が好みのものでない場合は、実際に変更する必要があり、このスクリプトはbusybox'sで正常に動作しawkます。

これは世界最速のソリューションにはなりませんが、実装は非常に簡単で、主に構成ファイルを準備するために実行するので、速度はほとんど関係ありません。

警告: これと の唯一の大きな違いは、値が存在しない変数は変更envsubstされないことです。それは{{HAS-NO-VALUE}}正確にそのまま残され、 asenvsubstはそれらを削除します(空白に置き換えます)。

必要に応じて、 にさらにコードを追加することで、これを修正できますawk

于 2021-03-18T15:53:11.567 に答える