我想导出一个环境变量,其值包含一个变量,但我不希望在导出过程中评估该变量(位于该值内)。 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...done
是Compound 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
, ...) for
、do
、;
、done
等失去了其特殊含义。
答案4
问题有两个方面:
- 在变量中存储复杂的表达式
- 执行存储的表达式
为了存储表达式,可能需要转义序列和特殊引用(这在您的示例中似乎是正确的)。执行可以通过两种方式进行:
- 函数调用如 Borealid 的答案: data=`STY()` - 函数的标准输出存储到变量中
- 表达式求值: data=
eval $STY
示例中给出的变量定义