for 루프를 사용하여 명령줄 인수를 실행하려고 하는데 이전에 이 작업을 시도해 본 적이 없어서 문제가 있습니다.
다음 명령을 사용하고 있습니다.
for((a=1; a<20; a++));
do
./a.out -N 10000 -D .25*a -E 0.7788007831;
done
값을 읽으려면 C에서 getopt 함수를 사용하고 있습니다. D의 다양한 값(출력에서는 Delta라고 함)을 시도하고 싶습니다. 그러나 이 명령을 실행하면 다음과 같은 결과가 나타납니다.
Acceptance rate is: 0.928400
Estimate is: 0.758704
Error is : 0.020097
Delta used: 0.250000
Acceptance rate is: 0.928400
Estimate is: 0.758704
Error is : 0.020097
Delta used: 0.250000
Acceptance rate is: 0.928400
Estimate is: 0.758704
Error is : 0.020097
Delta used: 0.250000
Acceptance rate is: 0.928400
Estimate is: 0.758704
Error is : 0.020097
Delta used: 0.250000
...
Acceptance rate is: 0.928400
Estimate is: 0.758704
Error is : 0.020097
Delta used: 0.250000
문제가 무엇인지 잘 모르겠습니다.
답변1
우선, 쉘 변수를 참조하려면 $foo
표기법을 사용해야 합니다. a
단지 문자 "a"( 10000
5자리 숫자와 같은 방식)만 있지만 $a
당시 변수에 포함된 모든 항목으로 확장됩니다.
2. 셸에서 산술 연산을 수행합니다.산술 확장 구문예 , 따라서 값에 25를 곱하도록 $(( expression ))
쓸 수 있습니다 . (10을 기준으로 합니다.)$(( 25 * $a ))
a
여기서 직면한 문제는 Bash(및 POSIX 쉘)가 정수에 대해서만 산술 연산을 수행할 수 있으므로 이를 곱하면 0.25
작동하지 않는다는 것입니다.
zsh에서는 부동 소수점 연산이 작동하므로 다음을 수행할 수 있습니다.
for ((a=1; a<20; a++)); do
echo $((.25 * $a))
done
하지만 Bash나 표준 셸에서는 수학을 수행하려면 외부 프로그램을 사용해야 합니다.
for ((a=1; a<20; a++)); do
echo $( echo ".25 * $a" | bc -l )
done
또는 귀하의 명령에 따라:
for ((a=1; a<20; a++)); do
./a.out -N 10000 -D $( echo ".25 * $a" | bc -l ) -E 0.7788007831;
done
물론, 실행 중인 프로그램이 곱셈을 할 수 있고 문자열 등을 전달하려는 경우 .25*1
에는 .25*2
다음을 사용할 수 있습니다.
... -D ".25*$a"
그리고 그 주변의 인용문, 그렇지 않으면 *
간주 되기 때문에파일 이름 일치(glob). (실제로 변수 확장이나 명령어 치환을 사용하는 대부분의 곳에는 따옴표를 붙여야 하는데, 참고하도록 하겠습니다.언제 큰따옴표가 필요합니까?이 점에 대해서. )
여기에 설명된 셸에서 부동 소수점 연산을 수행하는 방법에는 여러 가지가 있습니다.Bash 또는 다른 언어/프레임워크에서 정수 및 부동 소수점 계산을 수행하는 방법은 무엇입니까?