在运行时评估Unix中的变量

时间:2012-08-20 07:36:11

标签: shell unix sed awk

我有点想在Unix脚本中解决这个问题。

supose我有一个包含

的文件
a=4
b=3
c=a+b
d=c+a
e=a+b+5+d

我必须得到像

这样的输出
a=4
b=3
c=7
d=11
e=23

我尝试过使用AWK的逻辑,无论RHS变量是什么,我都会用$ {variable}替换它 例如

e=a+b+5+d

将以

结束
e=${a}+${b}+5+${d}

但我不确定如何在AWk中当前运行的shell中获取"a,b,d"的值。在将a = 4的内容写入文件后使用“source”关键字。但它不起作用。

请以其他方式提出建议,因为我认为我的方式不会起作用。

3 个答案:

答案 0 :(得分:4)

如果您在公式expr.sh中有公式,那么这将有效:

sed -e 's:=:=$((:' -e 's:$:)):' expr.sh |bash -x

说明:e=$((a+b+5+d))将评估$(())之间的表达式(包括展开所有变量)并将结果分配给e

答案 1 :(得分:1)

bc -q inputfile <(echo '"a="; a; "b="; b; "c="; c; "d="; d; "e="; e; halt')

如果您的shell或环境不支持进程替换:

{ cat inputfile; echo '"a="; a; "b="; b; "c="; c; "d="; d; "e="; e; halt'; } | bc -q

如果您使用的是GNU bc,则可以使用print声明:

bc -q inputfile <(echo 'print "a=", a, "\n", "b=", b, "\n", "c=", c, "\n", "d=", d, "\n", "e=", e, "\n"; halt')

答案 2 :(得分:0)

您可以在shell中执行此操作,无需外部工具。

如果shell是ksh,bash或zsh,则将变量声明为整数,每个赋值将在解析时执行算术运算。

typeset -i a b c d e
. ./assignments.sh

如果您事先不知道变量列表,请解析它。

typeset -i $(<assignments.sh sed -n 's/^ *\([A-Z_a-z][0-9A-Z_a-z]*\)=.*/\1/p')
. ./assignments.sh

请注意,这假设算术计算中或=符号周围没有空格,文件中没有其他内容(可以在shell语法中添加注释,例如以{{开头的行) 1}})。

如果你只能假定一个POSIX shell,或者算术赋值包含空格,你需要明确地进行算术计算。

#

同样,此代码假定该文件仅包含

之类的行
while IFS='=' read -r var expr; do
  var=$((set -f; echo $var)) # strip leading and trailing whitespace from $var
  eval "$var=\$(($expr))"
done <assignments.sh

如果需要,请添加错误检查。