在bash中截断浮点数作为变量filename

时间:2016-02-14 17:44:18

标签: bash filenames

我想为名称为" r?。???。txt"的所有文件执行for循环,其中?。???是从0.000到3.999的浮动。但是,据我所知,bash没有整数...这变得很头疼......

我尝试用繁琐的for循环做两个变量来表示十进制之前和之后的数字。但是,如果你有?.00?我还需要插入零。因此,我需要对浮点数进行适当处理以及如何存储/输出它们。

总之,我面临两个问题

  1. 在bash中做浮动
  2. 输出浮动为值并传递给文件名
  3. 谢谢。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

答案1)对于浮点计算,您必须将任务委托给其他程序,例如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,find。表示在当前目录中查找

  • * / =>仅检查文件名并跳过主要目录结构

  • [0-9]匹配范围0到9

  • 中的任何数字
  • \。意味着匹配一个点

  • [0-9] \ {3 \}表示[0-9] {3}正好匹配3位数,每位数字可以在0-9范围内

  • 最后以.txt

  • 结尾

对于答案2)你可以通过循环查找命令的输出将该浮点值作为字符串

$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