BASHで10進数を使用したファイルの命名

BASHで10進数を使用したファイルの命名

ファイルの作成に使用した手順に従ってファイル名を指定したいと思います。ステップサイズは10進数で表され、私が知っている限り、bashで10進数を処理することは困難です。コードは次のとおりです。

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

シェルはbash浮動小数点演算を実行しません。

これは、浮動小数点値が目的の方法で使用できないことを意味します。代わりに、次のものを使用できます。

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

少数演算を実行する必要はありません。文字列を生成してください。

とにかく、あなたの例は1桁だけを変更します。より一般的なバージョン:

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

シェルで浮動小数点数を使用して算術(加算、減算、乗算など)を実行するのは簡単ではありません。

ただし、ほとんどのシェルは浮動小数点数を印刷できます。

$ 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

シェルで数学を実行するには、bcまたはawkが必要です。

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


関連情報