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