#!/bin/sh --
expression_to_evaluate='12 + 3'
printf '%s\n' "Arithemtic Expansion: $(( $expression_to_evaluate ))"
printf '%s' 'bc: '
printf '%s\n' "$expression_to_evaluate" | bc
printf '%s' 'awk: '
awk -v expression_to_evaluate="$expression_to_evaluate" -- 'BEGIN{printf "%d\n", expression_to_evaluate}'
산출:
Arithemtic Expansion: 15
bc: 15
awk: 12
awk
15 대신 12를 반환합니다. 수학 계산을 수행하기 위해 문자열을 어떻게 입력합니까 awk
?
답변1
expression_to_evaluate
이것이 작동하는 동안 원본을 제어하지 않는 한 보안 위험이 있으므로 수행하지 않는 것이 좋습니다 .
$ expression_to_evaluate='12 + 3'
$ awk "BEGIN{printf \"%d\n\", $expression_to_evaluate}"
15
답변2
awk
문자열로 제공되는 일반 산술 표현식을 평가할 수 있는 방법은 없습니다. bc
반면에 쉘과 마찬가지로 표현식을 받아들이고 평가합니다.
문자열을 수학 표현식으로 평가하려면 awk
표현식을 다음과 같이 삽입해야 합니다.암호프로그램 에 추가 awk
하거나(잠재적으로 코드 삽입 취약점 생성) 평가하려는 표현 유형에 대한 자체 파서를 작성하십시오(이것은 일반적인 컴퓨터 과학 과제입니다).
의 값이 정수로 변환되면 문자열의 공백 문자까지 변환될 수 있으므로 코드 12
에서 이를 얻을 수 있습니다 . 이는 문자열을 정수로 변환할 때 C 라이브러리 함수가 작동하는 방식이며 아마도 뒤에서 사용되는 것 같습니다.awk
expression_to_evaluate
strtol()
awk
답변3
편집하다
나는 이 함수를 오래 전에 작성하여 자동으로 awk로 가져왔다는 사실을 잊어버렸습니다.
eval 함수의 코드는 다음과 같습니다.
function eval(str,cmd,line,ret) {
cmd = "gawk \047BEGIN{print " str "; exit}\047"
if ( (cmd | getline line) > 0 ) {
ret = line
}
close(cmd)
return ret
}
파일에 넣으면 스크립트 전에 가져올 수 있습니다
awk -i fileWithFunction.awk '{print eval($1)}'
나는 awk를 함수로 가지고 있으므로 자주 사용하는 함수를 가져오는 것에 대해 생각할 필요가 없습니다.
awk () {
awk -i awk_functions.awk "$@"
}
혼란을 드려 죄송합니다!
원본 게시물
(참고로 이 함수는 파일에서 가져오거나 awk 스크립트에 넣어야 합니다! 위를 참조하세요.) awk 의 함수는 eval()
원하는 작업을 수행합니다. 이는 gawk에 따라 다를 수 있지만 사용하지 않는 경우에는 gawk
그렇게 해야 합니다. :)
예
$ expression="1+1"
$ echo | awk -v expression=$expression '{print eval(expression)}'
2
$ expression="2^10"
$ echo | awk -v expression=$expression '{print eval(expression)}'
1024
간단한 awk 프로그램 입력을 생성하여 입력 값을 가져와 처리할 수도 있습니다.
$ awk 'BEGIN{printf "Expression:"}{print eval($0);printf "Expression:"}'
Expression:2^29
536870912
Expression: log(10)/log(30)
0.676992
Expression: I love cake
답변4
echo $expression_to_evaluate | awk -F "+" '{print ($1+$2)}'