我有一个配置文件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
然后读取|
-delimited 输出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_"
文件中的 shell 变量如果未替换为脚本中变量的值,则将像任何其他文本一样读取。这就是为什么你会得到NewYork_${CUT_NO}_
.
执行此操作的另一种方法是传递字符串NewYork_${CUT_NO}_
(eval printf '%s\n' "$c3"'
如果字符串存储为$c3
)并将值分配回c3
新变量或分配给新变量,但eval
通常认为对于评估用户提供的数据不安全(例如,说最后一列有值NewYork_${CUT_NO}_;ls -l
或更危险的东西)。