Shell 基于字符串的ENVSUT

Shell 基于字符串的ENVSUT,shell,text,environment-variables,Shell,Text,Environment Variables,我的文本文件中有以下两行 $MyEnv someText$MyEnv 我想使用envsubt只替换第二个出现的MyEnv变量。如何使用字符串“someText”来区分变量的第一次和第二次出现以及env变量中的替换 因此envsubstfile2 file 2 $MyEnv someTextValueofMyEnv 这是怎么可能的以下代码将替换输入第二行上的所有环境变量。请求的命令是唯一使用的非内置命令 L=0 while read line; do L=$((L+1)) if [ $

我的文本文件中有以下两行

$MyEnv
someText$MyEnv
我想使用envsubt只替换第二个出现的MyEnv变量。如何使用字符串“someText”来区分变量的第一次和第二次出现以及env变量中的替换

因此
envsubstfile2

file 2
$MyEnv
someTextValueofMyEnv

这是怎么可能的

以下代码将替换输入第二行上的所有环境变量。请求的命令是唯一使用的非内置命令

L=0
while read line; do
  L=$((L+1))
  if [ $L = 2 ]; then
    echo "$line" |envsubst
  else
    echo "$line"
  fi
done < file1 > file2

注意:
envsubt
将仅替换导出的变量。
envsubst
命令不可移植;它是的一部分,不是或(LSB)的一部分

要完全可移植(并且完全使用sh内置软件!),您需要使用
eval
,如果不进行大量额外检查,这是不安全的

while read line; do
  # $line contains the string 'someText$MyEnv'
  # (literally: $line does not match itself when removing that string)
  if [ "$line" != "${line#*someText\$MyEnv}" ]; then
    echo "$line" |envsubst
  else
    echo "$line"
  fi
done < file1 > file2