답변:
$(command)
구문의 출력을 리턴한다 command
. 여기서는 cat
표준 입력 (stdin)에서 표준 출력 (stdout)으로 모든 것을 복사 하는 매우 간단한 프로그램을 사용하고 있습니다. 당신이 실행되기 때문에 awk
큰 따옴표 안에 스크립트는이 $(cat)
쉘에 의해 확장 하기 전에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
그래서, awk
실행 실제로 BEGIN{ print ((3+(2^3)) * 34^2 / 9)-75.89 }'
1337을 반환합니다.
이제는 $*
쉘 스크립트에 지정된 모든 위치 매개 변수로 확장되는 특수 쉘 변수입니다 (참조 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.
그러나이 변수는 비어 있습니다. 따라서 awk
스크립트는 다음과 같습니다.
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"
+ awk 'BEGIN{ print }'
+ echo '((3+(2^3)) * 34^2 / 9)-75.89'
은 $*
빈 문자열로 확장하고, awk
빈 문자열을 인쇄했다, 그리고 더 출력을 얻을 수없는 이유입니다.
bc
대신 대신 사용하고 싶을 수도 있습니다 .
$ echo '((3+(2^3)) * 34^2 / 9)-75.89' | bc
1336.11
scale=
(OP는 leetspeak와 놀고 싶다고 생각합니다) 길을 찾을 수 없었습니다. 내 시스템으로 bc -l
돌아갑니다 1336.99888888888888888888
.
bc -l
. 그렇지 않으면 위에 게시 한 불일치가 나타납니다 (나눗셈 결과가 잘린 곳).