Bash

在 BASH 中用十進制數字命名文件

  • May 13, 2020

我想用創建它們的步驟來命名我的文件。步長是小數,據我所知,在 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
.
.
.

請讓我知道是否有任何解決方法。謝謝。

bashshell 不做浮點運算。

這意味著您不能以您想要的方式使用浮點值。相反,您可以使用

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

引用自:https://unix.stackexchange.com/questions/586100