linux - 扩展文件中的已知环境并保留其他环境

标签 linux bash shell

我确信有一种非常简单的方法可以做到这一点。我正在尝试获取一个包含一些环境变量的文件并对其进行扩展,以便将已知的那些扩展到它们的值,而那些不是已知的则单独保留。

例如,如果我的文件包含以下内容:

${I_EXIST}
${I_ALSO_EXIST}
${I_DONT_EXIST}

这将扩展为:

existValue
alsoExistValue
${I_DONT_EXIST}

理想情况下,我希望尽可能简单地执行此操作,因此我不想使用 sed、awk 或 perl 进行复杂的替换。我在想类似于“这里”文件的东西,但除了我无法获得正确的语法这一事实之外,它还会消除任何不展开的内容。例如:

cat <<EOF
> ${I_EXIST}
> ${I_ALSO_EXIST}
> ${I_DONT_EXIST}
EOF
existValue
alsoExistValue

(即最后一个值扩展为空)

更新

我真的应该明确表示我在考虑每行可能有不止一个替换。我确实找到了一种方法,如果我们不关心文件中显示为 ${MYVAR} 的变量,但也许 MYVAR 会这样做:

m4 $( env | sed 's/\([A-Za-z0-9]*\)=\([\/A-Za-z_0-9:|%*.-@] *\)/-D\1=\2' ) 我的文件

这使用 M4 预处理器替换您环境中的所有对。这里有几个问题:

  1. 对 reg exp 的事情感到抱歉。它看起来很讨厌,我相信有更好的表达方式。如果我的环境变量中有空格或集合中没有的任何异常字符,我会发现问题。
  2. 当然,这是一个生硬的替换工具(我试图避免这种情况),因此当您不希望它发生时,变量可能会被替换。

最佳答案

#!/bin/bash

while read a;
do
    n=$(eval echo $a)

    if [[ "$n" == "" ]]
    then
        echo $a
    else
        echo $n
    fi

done < input

以此为输入

${HOME}
${nonexistent}

给予

/home/myuser
${nonexistent}

关于linux - 扩展文件中的已知环境并保留其他环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6384857/

相关文章:

bash - 为什么 shell 脚本中的反引号不能帮我 cd 到一个目录

linux - 使用 zshrc 别名 sudo - 获取 "aliased to nocorrect sudo"

bash - 提取以数字开头的变量部分

linux - 无法为 Maven 代理端口使用环境变量

linux - 如何将存在于多个子文件夹中的多个目录中的文件复制到两层以上?

linux - Docker:带有参数和引号的入口点

SVN 仅导出更改的文件

bash - 带有 mysqldump 的 shell 脚本

mysql - 在 if 语句 shell 脚本中运行 sql 查询

linux - 如何在 bash 脚本中使用 awk 过滤 2 个日期之间的数据