The $(command)
sintaks akan kembali output dari command
. Di sini, Anda menggunakan cat
program yang sangat sederhana yang tugasnya hanya menyalin semuanya dari input standar (stdin) ke output standar (stdout). Karena Anda menjalankan awk
skrip di dalam tanda kutip ganda, yang $(cat)
diperluas oleh shell sebelum para awk
skrip dijalankan, sehingga membaca echo
output ke stdin dan salinan sepatutnya untuk stdout. Ini kemudian diteruskan ke awk
skrip. Anda dapat melihat ini beraksi dengan 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
Jadi, awk
sebenarnya berjalan BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
yang mengembalikan 1337.
Sekarang, $*
ini adalah variabel shell khusus yang diperluas ke semua parameter posisi yang diberikan ke skrip shell (lihat 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.
Namun, variabel ini kosong di sini. Oleh karena itu, awk
skrip menjadi:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
The $*
memperluas ke string kosong, dan awk
diperintahkan untuk mencetak string kosong, dan ini adalah mengapa Anda tidak mendapatkan output.
Anda mungkin hanya ingin menggunakan bc
:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11
bc -l
, jika tidak Anda akan mendapatkan perbedaan yang Anda posting di atas (di mana hasil divisi telah terpotong).