我有点想在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”关键字。但它不起作用。
请以其他方式提出建议,因为我认为我的方式不会起作用。
答案 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
如果需要,请添加错误检查。