导出环境变量

导出环境变量

我想导出一个环境变量,其值包含一个变量,但我不希望在导出过程中评估该变量(位于该值内)。 IE

export STY=for i in {0..3}; do echo $i; done

所以我的要求是,当我回显 STY 时,我需要的输出应该是

echo $STY
for i in {0..3}; do echo $i; done 

但 $i 是在导出期间评估的。我需要保持原样。

答案1

如果你想要什么你你自找的:

export STY="for i in {0..3}; do echo \$i; done"

如果你想要你真正的意思:

function STY() {
    for i in {0..3}; do echo $i; done
}
export -f STY

答案2

简而言之:使用 eval "$hello"。

(这个答案最初说:使用 eval $hello 但另一位发帖者指出 eval "$hello" 更安全。)

如下所示:

bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'

简单地在行的开头说 $hello 是行不通的 - 因为 for 循环是在 $variable 扩展之前处理的(面向阶段的语言,我讨厌它们):

bash-2.05a$ $hello
bash: for: command not found

但评估有效:

bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$ 

你曾经(或者可能曾经)做错了什么:

bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$ 

即至少在我使用的 bash 版本中,{0..4} 没有执行您认为应该执行的操作。

http://www.cyberciti.biz/faq/bash-for-loop/说 {0..4} 功能出现在 bash 3.0+ 中。

也许您和我一样(在 woprk,而不是家里)正在使用过时版本的 bash?

答案3

$hello未按预期运行的原因:

  • 扩展是在分割成标记后在命令行上执行的。
  • for...do...doneCompound Command在 tokenlize 阶段确定的。
  • for不是命令。

所以,你不能这样做:

$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token `do'

当 bash 将命令行拆分为 token 时,它看到"for"not for,因此 tokendo是意外的。


在你的情况下:

$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found

Bash 找到一个 token $hello,然后variable-expansion&&word-spliting按顺序发生。
实际上,bash 将结果解析为Simple Command

  • command( for) 将剩余部分作为 args( i, in, {0..4}, ;, do, ...)
  • fordo;done等失去了其特殊含义。

阅读更多详情

答案4

问题有两个方面:

  • 在变量中存储复杂的表达式
  • 执行存储的表达式

为了存储表达式,可能需要转义序列和特殊引用(这在您的示例中似乎是正确的)。执行可以通过两种方式进行:

  • 函数调用如 Borealid 的答案: data=`STY()` - 函数的标准输出存储到变量中
  • 表达式求值: data=eval $STY示例中给出的变量定义

相关内容