使用 shell 脚本从读取的字符串中解释变量

n-t*_*hen 0 bash shell-script variable read

我有一个文本文件,它通常填充多行,我想用 while 循环“打印”。此文件中的文本包含变量 - 我的问题是,这些变量的解释与包含存储在脚本中的变量的类似测试字符串不同。是否也可以从我的外部文件中解释这些变量,或者我是否必须事先解析它们等?$LINE_INSIDE和 和有$LINE_OUTSIDE什么区别?我尝试了来自其他问题的一些建议,例如${!varialbe_name}带有引号的不同结构,但到目前为止还没有运气。

    #!/bin/bash
    # color.sh
    BLUE='\033[1;34m'
    NC='\033[0m' # No Color

    LINE_INSIDE="${BLUE}Blue Text${NC}"
    echo -e ${LINE_INSIDE}

    while read LINE_OUTSIDE; do
            echo -e ${LINE_OUTSIDE}
    done < text_file
Run Code Online (Sandbox Code Playgroud)

输出:

脚本的输出

附加信息:我(确实)在我的输入文本文件中也有不应执行的 shell 命令。只应扩展变量。

Sté*_*las 6

将其写为以下可能更有意义:

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color

eval "cat << EOF
$(<text_file)
EOF
"
Run Code Online (Sandbox Code Playgroud)

而不是使用while read循环(顺便说一句,这不是阅读行的正确语法)。

当然,这意味着那里的代码将被解释。例如,$(reboot)在那里会导致重新启动,但这或多或少是您所要求的。

这也假设text_file不包含EOF一行。

另一种进行变量(环境变量)替换(而不是命令替换)的方法是使用 GNUgettextenvsubst

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst < text_file
Run Code Online (Sandbox Code Playgroud)

或者只扩展这两个变量:

BLUE=$'\033[1;34m'
NC=$'\033[0m' # No Color
export BLUE NC
envsubst '$BLUE$NC' < text_file
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1987 次

最近记录:

6 年,3 月 前