$(command)
Składnia powróci wyjście command
. Tutaj używasz bardzo prostego cat
programu, którego jedynym zadaniem jest skopiowanie wszystkiego ze standardowego wejścia (stdin) na standardowe wyjście (stdout). Ponieważ awk
skrypt jest uruchamiany w podwójnych cudzysłowach, $(cat)
jest on rozszerzany przez powłokę przed uruchomieniem awk
skryptu, więc odczytuje dane echo
wyjściowe do standardowego wejścia i odpowiednio kopiuje je na standardowe wyjście. To jest następnie przekazywane do awk
skryptu. Możesz to zobaczyć w akcji z 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
Tak awk
naprawdę działa, BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
co zwraca 1337.
Teraz $*
jest to specjalna zmienna powłoki, która rozwija się do wszystkich parametrów pozycyjnych podanych w skrypcie powłoki (patrz 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.
Jednak ta zmienna jest tutaj pusta. Dlatego awk
skrypt staje się:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
$*
Rozwija do pustego łańcucha, i awk
dowiaduje się, aby wydrukować pusty ciąg, i dlatego nie masz wyjścia.
Zamiast tego możesz po prostu użyć bc
:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11
bc -l
, w przeciwnym razie otrzymasz rozbieżność, którą opublikowałeś powyżej (w której wynik podziału został obcięty).scale=
(zakładam, że OP chce grać z leetspeak), ale nie mogłem znaleźć sposobu.bc -l
powraca1336.99888888888888888888
w moim systemie.