替换流中的bash变量

时间:2013-08-14 08:19:44

标签: bash variables replace

是否有一种简单的方法可以替换流中所有出现的变量?

所以,假设我有一个包含内容的文件。

$FOO $BAR $BAZ

我想做一些像

这样的事情
less file | replaceVars | process

replaceVars步骤应将所有对变量的引用替换为其值。我不想指定我想要替换的变量(就像我在使用sed或类似的东西时所需要的)。是否有某个内置函数或小程序允许我使用bash解析器或其他东西进行替换?

2 个答案:

答案 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

这会在将输出汇总到流程之前扩展输入文件中的变量。