Die $(command)
Syntax gibt die Ausgabe von zurück command
. Hier verwenden Sie das sehr einfache cat
Programm, dessen einzige Aufgabe darin besteht, alles von der Standardeingabe (stdin) in die Standardausgabe (stdout) zu kopieren. Da Sie das awk
Skript in doppelten Anführungszeichen ausführen, wird das Skript vor dem Ausführen des Skripts $(cat)
von der Shell erweitert , sodass es die Ausgabe in sein stdin liest und es ordnungsgemäß in sein stdout kopiert. Dies wird dann an das Skript übergeben. Sie können dies in Aktion sehen mit :awk
echo
awk
set -x
$ set -x
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $(cat) }"
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
++ cat
+ awk 'BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
1337
Läuft awk
also tatsächlich BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
was 1337 zurückgibt.
Jetzt ist das $*
eine spezielle Shell-Variable, die auf alle Positionsparameter erweitert wird, die einem Shell-Skript zugewiesen wurden (siehe man bash
):
* Expands to the positional parameters, starting from one. When the expan‐
sion is not within double quotes, each positional parameter expands to a
separate word. In contexts where it is performed, those words are sub‐
ject to further word splitting and pathname expansion. When the expan‐
sion occurs within double quotes, it expands to a single word with the
value of each parameter separated by the first character of the IFS spe‐
cial variable. That is, "$*" is equivalent to "$1c$2c...", where c is
the first character of the value of the IFS variable. If IFS is unset,
the parameters are separated by spaces. If IFS is null, the parameters
are joined without intervening separators.
Diese Variable ist hier jedoch leer. Daher wird das awk
Skript:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
Das wird $*
zu einer leeren Zeichenfolge erweitert und aufgefordert, eine leere Zeichenfolge awk
zu drucken. Aus diesem Grund erhalten Sie keine Ausgabe.
Vielleicht möchten Sie bc
stattdessen einfach Folgendes verwenden:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11
bc -l
, sonst erhalten Sie die Diskrepanz, die Sie oben gepostet haben (wo das Ergebnis der Teilung abgeschnitten wurde).