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
危険です。