bash变量重新评估

时间:2011-02-25 01:34:30

标签: sh

这是一个全新的问题,但我正在努力,所以我道歉。

我正在使用bourne shell作为init脚本。

我有一个变量 A = 1 B =“欢迎来到世界#$ A”

在脚本的某处,我有一个循环,将A更新为2,3,4等...如何让B重新评估?目前,B一直都是“欢迎来到世界第一”。

谢谢!

更新#1 - 一些代码:

#!/bin/sh

A=1
B="Welcome to #$A"

repeatloop() {
  for i in {1..5}
  do
    A=$i
    echo $B
  done
}

repeatloop

输出:

Welcome to #1
Welcome to #1
Welcome to #1
Welcome to #1
Welcome to #1

我想要获得#2,#3,#4 ....

4 个答案:

答案 0 :(得分:1)

当您输入...

B="Welcome to the world #$A"

在为B分配值之前,$ A的值已扩展。这意味着您在那里输入的内容相当于......

B="Welcome to the world #1"

所以“重新评估”毫无意义,因为B实际上并没有变量。

如果您希望在实际引用某些内容之前不扩展变量,请改用函数:

function B() {
    echo "Welcome to the world $1"
}

A=1
welcomeone=$(B $A)

A=2
welcometwo=$(B $A)

答案 1 :(得分:1)

每次执行B作业时,您都需要执行A作业:

#!/bin/sh

A=1
B="Welcome to #$A"

repeatloop() {
  for i in {1..5}
  do
    A=$i
    B="Welcome to #$A"
    echo $B
  done
}

repeatloop 

顺便说一句#!/bin/sh不是Bash(即使它是符号链接)。

答案 2 :(得分:1)

您可以将B参数设置为eval语句。然后在循环内调用它:

#!/bin/sh

A=1
B='eval echo "Welcome to #$A"'

repeatloop() {
  for i in {1..5}
  do
    A=$i
    $B
  done
}

repeatloop

输出:

Welcome to #1
Welcome to #2
Welcome to #3
Welcome to #4
Welcome to #5

答案 3 :(得分:0)

问题是,B设置为当前A的值。如果你想要它更新,你将从一个用新值A重新创建B值的函数中得到它。

用c / java等其他语言来思考。

int a = 0;
string b = "blah blah blah" + a; // b= "blah blah blah0"
a = 4;
//b still equals "blah blah blah0"