1

我有一些奇怪的要求要在 Unix 脚本中解决。

假设我有一个文件包含

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}

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

请提出其他方法,因为我认为我的方法行不通。

4

3 回答 3

4

如果您在文件中有公式expr.sh,那么这将起作用:

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

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

于 2012-08-20T07:42:29.767 回答
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')
于 2012-08-20T11:11:32.100 回答
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 语法中添加注释,例如以 开头的行#)。

如果您只能假设一个 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

同样,此代码假定文件仅包含如下行

a=3
b = a + 7

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

于 2012-08-20T11:38:55.217 回答