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

쉘은 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

소수 연산을 수행할 필요가 없습니다. 문자열을 생성하세요.

어쨌든 귀하의 예는 한 자리만 변경합니다. 보다 일반적인 버전:

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


관련 정보