2013-05-29 18 views
0

我的bash腳本是如何在我的bash腳本中添加「.2」?

read -p "num 1: " num1 
read -p "num 2: " num2 
tmbk=$(echo $num1 + $num2 | bc | sed ' 
    s/^\./0./  # .2 -> 0.2 
    s/^-\./-0./ # -.2 -> -0.2 
    s/\.0*$//  # 2.000 -> 2 
'); 
printf "result : %'d\n" $tmbk 

我用printf "%'d\n"與點分開3爲零。如果我使用printf "%s\n"進行串連,則此命令不會將3與零點分開。

我的問題: 如果我在num1中輸入0.1,在num2中輸入0.1,爲什麼結果看起來像這樣?

printf : 0.2: invalid number 
result : 0 

我希望我的bash腳本以這種方式打印result: 0.2,而不是invalid number

回答

1

怎麼樣?

echo "num 1 :" 
read num1 
echo "num 2 :" 
read num2 
awk -v a="$num1" -v b="$num2" 'BEGIN{print "result:" a+b}'; 

如果您需要輸出一定的格式,你可以在AWK

+0

但我希望該結果與點分離零。 – user2433277

+0

@ user2433277然後使用print「result:%'f ...(你會遇到'內部'問題,但這是另一個問題) – user829755

4

%d是整數使用printf。改爲嘗試%f

+0

感謝你的幫助。但我希望我的bash腳本結果是分隔點(1.000.000)和浮點數(0.2)的整數。我可以使用正則表達式來獲得結果嗎? – user2433277

+0

必須是一個奇怪的語言環境,其中1.000是一個整數,但0.1是一個浮點數。 – user829755

+1

'flag也與%f一起工作:'%'f「 – user829755

0

所以你想看''。作爲千位分隔符還可以作爲小數點嗎? 糟糕的主意,因爲那麼你不能確定1.234是一個浮點數還是一個整數。

語言環境是否有處理這種事情(需要這些語言環境中進行安裝):

for loc in C en_US de_DE de_CH; do 
    LC_NUMERIC=$loc 
    printf "%'d\t%'f\t%s\n" 1234 1234 $loc 
done 

結果:

1234 1234.000000  C 
1,234 1,234.000000 en_US 
1.234 1.234,000000 de_DE 
1'234 1'234.000000 de_CH 

正如你看到沒有這些語言環境使用相同的字符的千個分隔符並作爲小數點,這是很好的。

一旦你選擇了合適的語言環境,你只能同意肯特。如果你不喜歡bc的格式,awk比bc好。

0

你的要求有點奇怪「分離點(1.000.000)的整數」,你在做什麼?

此外,我會做一個小額外的行.....回聲「規模= 4; $ num1 + $ num2」| BC

爲「無效號碼輸出」 ::對於bash中的printf使用相同的格式化,在C的printf()函數是可用的,如libc庫的一部分....因此

%d , %i : stands for integers 
%g , %f : stands for floating point ... likewise , 

這個使用相同的驗證了的printf()將在交流使用 - 程序,從而使註釋「無效號碼」上encountring它需要一個整數一個浮點數,如下列:

Kaizen ~ 
    $ printf "result : %'d\n" 2.3 
    -bash: printf: 2.3: invalid number 
    result : 2 

Kaizen ~ 
$ printf "result : %'li\n" 2.3 
    -bash: printf: 2.3: invalid number 
result : 2 

我同意與@ignacio建議的一樣,所以如果你打算使用浮點值來初始化nt那麼你應該在你的代碼中放入%g或更好的%f。以下應該適用於您的代碼中的所有場景:

Kaizen ~ 
$ printf "result : %'f\n" 2.3 
result : 2.300000 

Kaizen ~ 
$ printf "result : %'g\n" 2.3 
result : 2.3