是否有一种简单的方法可以替换流中所有出现的变量?
所以,假设我有一个包含内容的文件。
$FOO $BAR $BAZ
我想做一些像
这样的事情less file | replaceVars | process
replaceVars步骤应将所有对变量的引用替换为其值。我不想指定我想要替换的变量(就像我在使用sed或类似的东西时所需要的)。是否有某个内置函数或小程序允许我使用bash解析器或其他东西进行替换?
答案 0 :(得分:3)
创建一个像这样的函数
function replaceVars {
local V IFS=
while read -r LINE; do
for V; do
LINE=${LINE//"$V"/"${!V}"}
done
echo "$LINE"
done
}
你可以在这样的流上调用它:
cat file | replaceVars FOO BAR BAZ | process
我将cat
替换为less
,因为less
并不真正与stdout交互,而是终端本身。你也可以这样做:
replaceVars FOO BAR BAZ < file | process
如果要将这些变量名称存储在数组中,可以这样做:
VARS=(FOO BAR BAZ)
replaceVars "${VARS[@]}" < file | process
顺便说一下,确保将其作为Bash运行。它的完整脚本示例可能是这样的:
#!/bin/bash
VARS=(FOO BAR BAZ)
function replaceVars {
local V IFS=
while read -r LINE; do
for V; do
LINE=${LINE//"$V"/"${!V}"}
done
done
echo "$LINE"
}
replaceVars "${VARS[@]}" < file | process
答案 1 :(得分:2)
使用eval
:
while read -r line; do eval echo "${line}"; done < inputfile | process
这会在将输出汇总到流程之前扩展输入文件中的变量。