有没有一种简单的方法来替换流中所有出现的变量?
所以假设我有一个包含内容的文件。
$FOO $BAR $BAZ
我想做一些类似的事情
less file | replaceVars | process
replaceVars 步骤应将所有对变量的引用替换为它们的值。我不想指定我想要替换的变量(就像我在使用 sed 或类似的东西时需要的那样)。是否有一个内置函数或小程序允许我使用 bash 解析器或其他东西来做这个替换?
创建一个这样的函数
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
并没有真正与标准输出交互,而是终端本身。您也可以这样做:
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
使用eval
:
while read -r line; do eval echo "${line}"; done < inputfile | process
这将在将输出传递到进程之前扩展输入文件中的变量。