一尘不染

强制bash扩展从文件加载的字符串中的变量

linux

我正在尝试找出如何使bash(强制?)扩展字符串(从文件中加载)中的变量。

我有一个名为“ something.txt”的文件,其内容如下:

hello $FOO world

然后我跑

export FOO=42
echo $(cat something.txt)

这将返回:

   hello $FOO world

即使设置了变量,它也不会扩展$ FOO。我无法评估或获取文件-因为它将尝试执行该文件(它本身不能执行-我只想插入包含变量的字符串)。

有任何想法吗?


阅读 205

收藏
2020-06-02

共1个答案

一尘不染

我偶然发现了我认为该问题的答案: envsubst命令。

envsubst < something.txt

如果您的发行版中尚未提供该功能,请在

GNU包gettext

@Rockallite-我写了一些包装脚本来解决’\ $’问题。

(顺便说一句,有一个envsubst的“功能”,在https://unix.stackexchange.com/a/294400/7088上
进行了解释, 该扩展仅用于扩展输入中的某些变量,但是我同意转义异常的功能更多方便。)

这是我的脚本:

#! /bin/bash
      ## -*-Shell-Script-*-
CmdName=${0##*/}
Usage="usage: $CmdName runs envsubst, but allows '\$' to  keep variables from
    being expanded.
  With option   -sl   '\$' keeps the back-slash.
  Default is to replace  '\$' with '$'
"

if [[ $1 = -h ]]  ;then echo -e >&2  "$Usage" ; exit 1 ;fi
if [[ $1 = -sl ]] ;then  sl='\'  ; shift ;fi

sed 's/\\\$/\${EnVsUbDolR}/g' |  EnVsUbDolR=$sl\$  envsubst  "$@"
2020-06-02