Các $(command)
cú pháp sẽ trở lại với sản lượng command
. Ở đây, bạn đang sử dụng cat
chương trình rất đơn giản với công việc duy nhất là sao chép mọi thứ từ đầu vào tiêu chuẩn (stdin) sang đầu ra tiêu chuẩn (stdout). Kể từ khi bạn đang chạy các awk
kịch bản bên trong dấu ngoặc kép, những $(cat)
được mở rộng bằng vỏ trước các awk
kịch bản được chạy, vì vậy nó đọc echo
ra vào stdin và bản sao hợp lệ nó để stdout của nó. Điều này sau đó được chuyển đến awk
kịch bản. Bạn có thể thấy điều này trong hành động với 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
Vì vậy, awk
thực sự đang chạy BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
mà trả về 1337.
Bây giờ, $*
biến shell là đặc biệt mở rộng cho tất cả các tham số vị trí được cung cấp cho tập lệnh shell (xem 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.
Tuy nhiên, biến này là trống ở đây. Do đó, awk
kịch bản trở thành:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
Việc $*
mở rộng thành một chuỗi trống và awk
được yêu cầu in một chuỗi trống và đây là lý do tại sao bạn không nhận được đầu ra.
Bạn có thể chỉ muốn sử dụng bc
thay thế:
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11
bc -l
, nếu không, bạn sẽ nhận được sự khác biệt mà bạn đã đăng ở trên (nơi kết quả của việc phân chia đã bị cắt ngắn).