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

たとえば、RHS変数で利用可能なものは何でも ${variable} に置き換えるというロジックを使用してAWKを使用してみました

e=a+b+5+d

として出てきます

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

しかし"a,b,d"、AWk で現在実行中のシェルで値を取得する方法がわかりません。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')

シェルまたは環境がプロセス置換をサポートしていない場合:

{ 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

これはシェル自体で行うことができ、外部ツールは必要ありません。

シェルが 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

これは、算術計算内または記号の周りに空白がなく、ファイルに他に何もないことを前提としていることに注意してください=(シェル構文にコメントがあってもかまいません。たとえば、 で始まる行#)。

POSIX シェルしか想定できない場合、または算術代入にスペースが含まれている場合は、算術計算を明示的に行う必要があります。

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 に答える