2015-02-23 74 views
0

我想創建一個簡單的bash函數來評估我使用awk傳遞它的數學。例如:Bash函數做awk數學(浮點數)

awkmath() 
{ 
    echo "$1 $3" | awk '{ print($1 "'$2'" $2) }' 
} 

awkmath '2' '*' '3' #Prints 6 

到目前爲止,我無法得到這個工作。而不是得到「6」,我得到「2 * 3」。我知道還有其他方法可以做到這一點。但我很想看看是否有人能夠完成這項工作。這似乎是一件簡單的事情,但bash解釋會有一些細節。

回答

2
awkmath() 
{ 
    echo "$1 $3" | awk '{ print $1 '"$2"' $2 }' 
} 
$ awkmath '2' '*' '3' 
6 

這在外殼使用字符串分隔符("),以避免構造awk命令前,通配和分詞:

'{print $1 '"$2"' $2}' - >'{print 2 '"*"' 3}' - >'{print 2 * 3}'

,而你原本在構建awk命令後在頁面內分隔符*

'{print $1 "'$2'" $2}' - >'{print 2 "'*'" 3}' - >'{print 2 "*" 3}'

事實上,如果在構建awk命令之前*沒有展開到當前目錄中的文件名列表中,那麼在第二種情況下你會幸運的。

1

我會使用bc代替AWK的:你的數學表達式可以是任意複雜

math() { 
    local out=$(bc -l <<< "$*") 
    if [[ -z $out ]]; then 
    return 1 
    else 
    echo "$out" 
    fi 
} 

math '(2+3)' \* '(5-sqrt(9))' 

你確實有保護是專用於shell的字符的痛苦