在 BASH 中使用十进制数字命名文件

在 BASH 中使用十进制数字命名文件

我想用创建文件的步骤来命名我的文件。步长以小数为单位,据我所知,在 bash 中处理小数是很困难的。这是代码:

for i in $(seq 0.05 0.05 0.45) 
do
.
.
.
mv POSCAR slipped_112_111_$(( i*2 )).vasp
done

我收到的错误如下:

./slip_loop.sh: line 3: 0.05: syntax error: invalid arithmetic operator (error token is ".05")

预期的文件名:

slipped_112_111_0.10.vasp
slipped_112_111_0.20.vasp
slipped_112_111_0.30.vasp
.
.
.

如果有任何解决办法,请告诉我。谢谢。

答案1

shellbash不执行浮点运算。

这意味着您无法按照您想要的方式使用浮点值。相反,你可以使用

for number in {1..9}; do
    # other code here

    printf -v name 'slipped_112_111_0.%d0.vasp' "$number"
    mv POSCAR "$name"
done

printf -v语句直接打印到变量中name。格式字符串格式化数字,使其出现在新文件名称中的正确位置。

这将执行以下mv命令:

mv POSCAR slipped_112_111_0.10.vasp
mv POSCAR slipped_112_111_0.20.vasp
mv POSCAR slipped_112_111_0.30.vasp
mv POSCAR slipped_112_111_0.40.vasp
mv POSCAR slipped_112_111_0.50.vasp
mv POSCAR slipped_112_111_0.60.vasp
mv POSCAR slipped_112_111_0.70.vasp
mv POSCAR slipped_112_111_0.80.vasp
mv POSCAR slipped_112_111_0.90.vasp

如果您需要浮点数用于其他用途:

for number in {1..9}; do
    # other code here

    value=$( bc <<<"scale=2; $number/20" )

    printf -v name 'slipped_112_111_0.%d0.vasp' "$number"
    mv POSCAR "$name"
done

答案2

无需进行十进制算术:创建字符串。

无论如何,你的例子只改变一位数字。更通用的版本:

paul $ for i in {010..200..10}; do
> echo "${i:0:1}.${i:1:2}"
> done
0.10
0.20
0.30
0.40
0.50
0.60
0.70
0.80
0.90
1.00
1.10
1.20
1.30
1.40
1.50
1.60
1.70
1.80
1.90
2.00

答案3

在 shell 中使用浮点数执行算术(加、减、乘等)并不简单。

但大多数 shell 可以打印浮点数:

$ for i in $(seq 0.10 0.1 0.9); do printf '%5.3f  ' "$i"; done
0.100  0.200  0.300  0.400  0.500  0.600  0.700  0.800  0.900

这将变成:

$ for i in $(seq 0.10 0.1 0.9); do printf 'slipped_112_111_%5.3f.vasp\n' "$i"; done
slipped_112_111_0.100.vasp
slipped_112_111_0.200.vasp
slipped_112_111_0.300.vasp
slipped_112_111_0.400.vasp
slipped_112_111_0.500.vasp
slipped_112_111_0.600.vasp
slipped_112_111_0.700.vasp
slipped_112_111_0.800.vasp
slipped_112_111_0.900.vasp

在 shell 中做数学需要 bc 或 awk。

$ printf '%5.3f" "$(echo "0.3321 + 0.3625" | bc -l)"
0.695


相关内容