替换从另一个脚本内的文件读取的变量的值

替换从另一个脚本内的文件读取的变量的值

我有一个配置文件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或更危险的东西)。

相关内容