2015-12-23 41 views
0

我正在讀取具有多列的文件,並將文件的2列轉儲爲2個不同的數組。現在基於一個條件,我需要從數組中檢索2個值之間的差異。所以我的代碼看起來是這樣的 -減去具有浮點小數的2個數組值

if [ condition ]; then 
VAL = ((${local[$x]} - ${local[$y]})) 
fi 

的事情是,當我能夠呼應,看看這兩個值${local[$x]}${local[$y]},減法操作給我一個語法錯誤。我知道這是失敗的,因爲數組中當前保存的值涉及浮點十進制值 - 例如3456712.126758,並且賦值會在小數部分引發錯誤。我知道算術運算並不是bash shell的一個優點,因爲浮點數被認爲是字符串,因此是問題。

請你幫忙拿到合適的格式嗎? 我應該做這樣的事情

VAL= awk '{ print ${local[$x]} - ${local[$y]} }' 

VAL=echo ${local[$x]} - ${local[$y]} | bc -l 

我相信上面的語法是錯誤的,與語法好心幫,我需要它分配分配到外地VAL相減的結果。

+0

這是一個非常基本的bash的問題。通過使用bash教程,您將從中受益。 [bash tag wiki](http://stackoverflow.com/tags/bash/info)上有幾個鏈接,請參閱參考資料部分 –

+0

同意,謝謝:) – zephyr

回答

1

不僅浮點,而且間距也會導致語法錯誤。 Bash變量賦值必須沒有空格,如val=x,而不是val = x

大寫變量名是爲環境變量保留的,建議使用小寫字母代替自己的變量。 (呵呵,local保留字。)

你的任務不會與適當的間隔工作,無論是:在arithmetic expression

var=((${vals[$x]} - ${vals[$y]})) # syntax error near unexpected token `(' 

只是評估它的內容,但不返回任何東西。您可以使用=之後的部分作爲條件。爲了使返回的東西,你需要arithmetic expansion(注意額外$):

var=$((${vals[$x]} - ${vals[$y]})) # works for integers 
    ^

在算術方面,你甚至都不需要預先$到您的變量:

var=$((vals[x] - vals[y])) 

作品只是以及。例外:associative arrays,你還是要做到這一點對指數:

$((vals[$x])) 

最後,因爲你注意到沒有,這一切並不浮點數工作。相反管道到bc的,你也可以使用一個here string,避免產卵子shell:

$ vals=(1.1 2.2) 
$ x=0 
$ y=1 
$ echo $((local[x] - local[y])) # No '$' needed for variable expansion 
bash: 1.1: syntax error: invalid arithmetic operator (error token is ".1") # But :(
$ bc -l <<< "local[x] - local[y]" # Requires '$' - these expand to nothing 
0 
$ bc -l <<< "${local[x]} - ${local[y]}" # Works! 
-1.1 
1

使用awk:

awk -v a=${a} -v b=${b} 'BEGIN{print a - b}' 

使用BC:

echo "${a} - ${b}" | bc -l 

參見其他選項here

+0

並捕獲結果:'val = $ (echo ... | bc -l)' –

+0

這個效果很好:)乾杯 – zephyr