サーバー構成ファイルを最新の形式に更新するスクリプトを作成しようとしています。このスクリプトの目的は、既存の(定義済み)変数を最新の構成(一時ファイル)にコピーし、古い構成ファイルを新しく作成された構成ファイルにコピー/上書きすることです。
私の理解によると二重引用符で変数を展開しますsed
。パターンに1つの変数しか使用されていない場合は、うまく機能しているようです。
sed -i "s|random|$PASSWORD|g" /tmp/latest_config
上記の例では、一時構成ファイルが正常に変更され、すべてのインスタンスがの値random
に置き換えられました$PASSWORD
。しかし、その逆は真実ではありません。
sed -i "s|$PASSWORD|random|g" /tmp/latest_config
上記の例では、何も起こらず、sedエラーも発生しません。一時構成ファイルの値が$PASSWORD
変更されていません...
注:$PASSWORD
最初の例では、このスクリプトの上部にある「古い」構成ファイルが提供されていますが、2番目の例の目標は変数の値を変更することです。
SEネットワークで何十もの類似の「変数」の質問を見ましたが、多くの答えが間違っているか(一重引用符を使用するなど)、私には適していません。一重引用符、二重引用符、括弧(実際に検索された変数と環境変数を区別するため)など、さまざまな形式を試しましたが、sed
これまで何も機能しませんでした。たとえば、次のようになります。
sed -i "s|$PASSWORD|$PASSWORD|g" /tmp/latest_config
sed -i "s|$PASSWORD|${PASSWORD}|g" /tmp/latest_config
sed -i "s|\$PASSWORD|${PASSWORD}|g" /tmp/latest_config
sed -i 's|$PASSWORD|"${PASSWORD}"|g' /tmp/latest_config
sed -i 's|\$PASSWORD|"${PASSWORD}"|g' /tmp/latest_config
唯一の効果的な解決策はハッカーソリューション:
sed -i "s|\(^PASSWORD=\).*|PASSWORD=\"$PASSWORD\"|g" /tmp/latest-config
なぜ?既存の変数を最初にエクスポートする必要がありますか、それともこれが最善ですか? ...