ファイルから読み込んだ変数の値を別のスクリプト内で置き換える [閉じる]

ファイルから読み込んだ変数の値を別のスクリプト内で置き換える [閉じる]

xyz.cfg次の値を持つ設定ファイルがあります

NewYork|US|NewYork_${CUT_NO}_
Delhi|INDIA|Delhi_${CUT_NO}_

housekeeping.shグローバル変数を含むスクリプトがあります。

CUT_NO=001

そして私はファイルをwhile読んでいます。xyz.cfg

しかし、その行を読んだ後は${CUT_NO}交換されませんでした。

o / pはそうすべきですNewYork_001_ が、わかりますNewYork_${CUT_NO}_

答え1

sedファイルのプレースホルダを変数の値に置き換えるために使用されます。

sed "s/\${CUT_NO}/$CUT_NO/" xyz.cfg

|次に、 - 区切り出力を読みますsed

sed "s/\${CUT_NO}/$CUT_NO/" xyz.cfg |
while IFS='|' read c1 c2 c3; do
  printf 'Column 3 has value "%s"\n' "$c3"
done

または

sed "s/\${CUT_NO}/$CUT_NO/" xyz.cfg |
awk -F '|' '{ printf("Column 3 has value \"%s\"\n", $3) }'

またはそのようなもの。

これにより

Column 3 has value "NewYork_001_"  
Column 3 has value "Delhi_001_"    

ファイルのシェル変数は、スクリプトの変数値に置き換えられない限り、他のテキストと同じように読み込まれます。それがあなたが得る理由ですNewYork_${CUT_NO}_

これを行うもう1つの方法は、文字列を渡しNewYork_${CUT_NO}_eval printf '%s\n' "$c3"'文字列が次のように格納されている場合$c3)、値をc3新しい変数に再割り当てすることです。ただし、evalこれは通常、ユーザー提供のデータを評価するのに安全ではないと見なされます(たとえば、最後の列に価値があると仮定)、またはよりNewYork_${CUT_NO}_;ls -l危険です。

関連情報