2016-02-14 57 views
1

我想爲名爲「r?。???。txt」的所有文件執行for循環,其中?。????是從0.000到3.999的浮動。但是,bash並沒有整數,據我所知...這變成頭痛...在bash中作爲變量文件名的截斷浮點數

我試圖做冗長乏味的循環與兩個變量代表小數前後的數字。但是,如果您有?.00?,我仍然需要插入零。因此,我將需要對浮點數進行適當的處​​理以及如何存儲/輸出它們。

總之,有兩個問題,我面對

  1. 做浮在bash
  2. 輸出浮動的值和傳遞到文件名

謝謝。

+0

有什麼不好處理2個整數的輸出循環獲取浮動值作爲一個字符串? '爲{0..3}中的一個;爲{000..999}中的b做;做回聲「r $ a。$ b.txt」;完成; done'。 –

+0

雅,你說得對... – Simon

回答

1

使用2個變量是一個好主意。

你可以保持零填充格式SEQ -f選項:

#!/bin/bash 
declare -i int=3; 
declare -i dec=1000; 

for i in $(seq 1 $int);do 
     for j in $(seq -f "%03g" 1 $dec); 
       do echo r$i.$j.txt; # or do find . -name "r$i.$j.txt"; 
     done; 
done; 
0

答案1)對於float計算,你將不得不任務委託給其他程序,如BC。

例如:

echo "scale=3;20.8/4 | bc 5.200

更多選項,您可以檢查:

https://unix.stackexchange.com/questions/40786/how-to-do-integer-float-calculations-in-bash-or-other-languages-frameworks
https://unix.stackexchange.com/questions/76060/perform-floating-point-arithmetic-in-shell-script-variable-definitions
How do I use floating-point division in bash?

找出文件名有浮點數,你可以使用正則表達式以及find命令:

$touch r3.987.txt $find . -regextype sed -regex ".*/r[0-9]\.[0-9]\{3\}.txt$" ./r3.987.txt

正則表達式類型是sed的,找到。裝置找到在當前目錄

  • */=>僅只檢查文件名和跳過前導目錄結構

  • [0-9]匹配範圍爲0的任何數字至9

  • \。裝置匹配點

  • [0-9] \ {3 \}裝置[0-9] {3}精確匹配3位和每個數字可以是在範圍0-9

  • 和最後在.txt

爲答案2結尾)你可以通過find命令

$for filename in "$(find . -regextype sed -regex ".*/r[0-9]\.[0-9]\{3\}.txt$")" 
> do 
> echo "Filename is $filename" 
> floatValueAsString=$(echo "$filename" | egrep -o '[0-9]\.[0-9]{3}') 
> echo "Float value as string is $floatValueAsString" 
> done 
Filename is ./r3.987.txt 
Float value as string is 3.987