在字符串中进行外壳替换

马修·詹姆斯·布里格斯

我在内存中有一个字符串,分配给一个 bash 变量,其中包含占位符。我想替换环境中使用变量的那些。

例如

#!/bin/bash
MYSTRING='Hello, ${FOO}'
export FOO="world!"
REPLACED=$(how?${MYSTRING})
echo "${REPLACED}"
# should return Hello, world!

我需要的是这部分 $(how?${MYSTRING})

(我是唯一会使用这个脚本的人,坏人没有机会注入恶意代码。)

莉·格雷

您可以使用envsubst来自 gettext 工具。

您可以使用,eval但您可能会冒着从字符串中执行不需要的语句的风险

至少,envsubst只会将环境变量扩展到它们的值,就是这样,没有别的,没有命令评估,甚至没有字符串替换......

请参阅:https : //www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html

#!/usr/bin/env bash
MYSTRING=$'Hello, ${FOO}'
FOO="world!"
REPLACED="$(
  # envsubst needs variables exported to its environment.
  # since this is a sub-shell, the environment scope
  # is this sub-shell.
  # It helps dealing with local variables that you would not want
  # to export to the environment for the main shell.
  # FOO's value is inherited from parent shell,
  # and exported to to this sub-shell's environment.
  export FOO  
  # pass MYSTRING as stdin here-string to envsubst
  envsubst <<<"$MYSTRING"
)"
echo "${REPLACED}"

请注意,这仅适用于简单变量,不适用于数组。需要导出变量才能使用envsubst

现在如上所述,非常谨慎,这可以通过以下方式完成eval

#!/usr/bin/env bash

MYSTRING='Hello, ${FOO}$(echo "eval is evil" >/tmp/pawned.txt)'
FOO="world!"
eval "REPLACED=\"${MYSTRING}\""
echo "${REPLACED}"

乍一看,输出看起来合法:

Hello, world! 

但是看看 cat /tmp/pawned.txt

eval is evil

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在JavaScript中进行字符串替换以将“ 9.61”转换为“ 9:61”?

如何找到带有模式的字符串并在Javascript中进行替换?

是否可以在YAML中进行字符串替换?

如何在here字符串中进行变量替换

如何在JavaScript中进行“原始”字符串搜索和替换,而不使用REGEX

使用OR门在单个if语句外壳脚本中进行多个字符串比较

如何从Arraylist中替换字符串而无需在Grails中进行迭代?

如何找到字符串的完全匹配并在Oracle中进行替换?

有效地在字符串中进行多次替换

如何使用MultiIndex在Python数据框列中进行字符串替换

在python中进行字符串比较

使用sed进行字符串替换

与原始字符串进行比较后在Perl中进行字符串替换

使用Format()在Python中进行动态字符串替换

使用sed进行字符串替换

在字符串中进行多个字符串替换时,如何避免使用var

用替换字符串进行迭代

使用OR门在单个if语句外壳脚本中进行多字符串比较

如何在多个查询中进行多个字符串替换?

在对象文字中进行字符串加法的方法

在扩展变量,将变量用作字符串文字并添加换行符的同时,在文件中进行文本替换

如何在Makefile中使用cat创建的变量中进行字符串替换?

如何在字符串变量 XSLT 中进行替换?

SQL:有没有办法在 SQL 中进行批量字符串替换?

Ansible:如何迭代多个键/值以在多个文件中进行字符串替换

如何在 f# 中进行非标准字符串替换?

C# 一次在一个字符串中进行多次替换

在 R 列的子集中进行字符串替换时遇到问题

如何在 Pyspark 中进行字符串算术运算