Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 扩展文件中的已知环境并保留其他环境_Linux_Bash_Shell - Fatal编程技术网

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

Linux 扩展文件中的已知环境并保留其他环境,linux,bash,shell,Linux,Bash,Shell,我相信有一个非常简单的方法可以做到这一点。我试图获取一个包含一些环境变量的文件,并将其展开,以便将已知的变量展开为它们的值,而不知道的变量则被单独保留 例如,如果我的文件包含以下内容: ${I_EXIST} ${I_ALSO_EXIST} ${I_DONT_EXIST} 这将扩大到: existValue alsoExistValue ${I_DONT_EXIST} 理想情况下,我希望这样做尽可能简单,因此我不希望使用sed、awk或perl进行复杂的替换。我在想一个类似于“Here”文件的

我相信有一个非常简单的方法可以做到这一点。我试图获取一个包含一些环境变量的文件,并将其展开,以便将已知的变量展开为它们的值,而不知道的变量则被单独保留

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

${I_EXIST}
${I_ALSO_EXIST}
${I_DONT_EXIST}
这将扩大到:

existValue
alsoExistValue
${I_DONT_EXIST}
理想情况下,我希望这样做尽可能简单,因此我不希望使用sed、awk或perl进行复杂的替换。我在想一个类似于“Here”文件的东西,但除了语法不正确之外,它还删除了任何不能扩展的内容。例如:

cat <<EOF
> ${I_EXIST}
> ${I_ALSO_EXIST}
> ${I_DONT_EXIST}
EOF
existValue
alsoExistValue
cat${I_也存在}
>${我不存在}
EOF
存在值
也存在价值
(即最后一个值扩展为零)

更新

我真的应该清楚地表明,我在考虑每一行可能不止一个替代品。我确实找到了一种方法,如果我们不担心文件中出现的变量
${MYVAR}
,但是
MYVAR
可能会:

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

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

  • 对不起,关于注册经验的事情。这看起来很恶心,我相信有更好的表达方式。如果我的环境变量中有空格或任何不在集合中的异常字符,我会发现问题
  • 当然,这是一个直截了当的替换工具(我试图避免),所以变量可能会在您不希望它发生时被替换
  • 将打印

    ${PATH} =  /usr/local/narwhal/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:~/bin
    ${HAVENOT} = 
    ${LOCALE} =  UTF-8
    
    根据需要修改输出格式:)

    将打印

    ${PATH} =  /usr/local/narwhal/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:~/bin
    ${HAVENOT} = 
    ${LOCALE} =  UTF-8
    
    根据需要修改输出格式:)

    给予

    给予


    容易阅读?也许不是。它很短,但很有效:-)

    所以我们需要注入的是
    :-“${FOOBAR}”

    为此,我们在末尾修剪
    }
    ,添加字符串,然后再放回另一个
    }

    # echo $r
    ${FOOBAR}
    # echo ${r%\}}
    ${FOOBAR
    
    最后一个
    \}
    并不是必须的,因为它在本例中并没有开头,但最好是显式的并避开它。(很像您会转义
    echo\*
    ,即使没有任何匹配文件的
    echo*
    会给您一个文本*)


    Edit2:这当然没有考虑到您希望在一行中支持多个变量;或者任何包含其他内容的行。

    是否易于阅读?也许不是。它很短,但很有效:-)

    所以我们需要注入的是
    :-“${FOOBAR}”

    为此,我们在末尾修剪
    }
    ,添加字符串,然后再放回另一个
    }

    # echo $r
    ${FOOBAR}
    # echo ${r%\}}
    ${FOOBAR
    
    最后一个
    \}
    并不是必须的,因为它在本例中并没有开头,但最好是显式的并避开它。(很像您会转义
    echo\*
    ,即使没有任何匹配文件的
    echo*
    会给您一个文本*)


    Edit2:这当然没有考虑到您希望在一行中支持多个变量;或者任何包含其他内容的行。

    我已经尝试过了,但有两件事不对(对我来说)(1)它将所有内容连接到一行,这不好-我需要文件的格式完全相同,(2)任何未知变量都应该保持原样,我需要看到${HAVENOT}在上面的输出中,我已经尝试过了,但是有两件事不对(对我来说)(1)它将所有内容连接到一行,这不好-我需要文件的格式完全相同,(2)任何未知变量都应该保持原样,我需要看到${HAVENOT}在上面的输出中。当变量被定义但没有值(或只有空格)时会发生什么?当变量被定义但没有值(或只有空格)时会发生什么?我最喜欢的回答是:一致、不可穿透和正确。请解释一下好吗?特别是那些。我最喜欢的回答是:一致、难以理解和正确。你能解释一下吗?尤其是那些。
    ${HOME}
    ${nonexistent}
    
    /home/myuser
    ${nonexistent}
    
    while read r; do
    echo $(eval echo ${r%\}}:-'$r'\})
    done < input
    
    # echo ${doesntexist:-Hello}
    Hello
    # doesexist=World
    # echo ${doesexist:-Will not be printed}
    World
    
    # echo $r
    ${FOOBAR}
    # echo ${r%\}}
    ${FOOBAR