루프를 사용하여 명령줄 매개변수 생성

루프를 사용하여 명령줄 매개변수 생성

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"( 100005자리 숫자와 같은 방식)만 있지만 $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 또는 다른 언어/프레임워크에서 정수 및 부동 소수점 계산을 수행하는 방법은 무엇입니까?

관련 정보