Bash 곱셈과 덧셈

for k in {0..49}; do a=$(($((2*$k))+1)); echo $a; done 

안녕하세요, 세 번째 줄에 대한 단순화 된 표현이 필요합니다. 명령 대체를 사용하지 마십시오.

코멘트

  • @Theophrastus : 제안 된대로 잘 작동하지만 (()) 대신 expr을 사용하려면 어떻게해야합니까? .
  • 이것은 C가 아니라 bash이므로 모든 ;-한 줄로 작성하지 않는 경우
  • 참조 : unix.stackexchange.com/q/40786/117549
  • declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
  • 참고 : $(( ... ))는 명령 대체가 아닌 산술 확장입니다.

답변

산술 확장 사용 :

for (( k = 0; k < 50; ++k )); do a=$(( 2*k + 1 )) echo "$a" done 

구식 expr 유틸리티 사용 :

for (( k = 0; k < 50; ++k )); do a=$( expr 2 "*" "$k" + 1 ) echo "$a" done 

bc -l 사용 ( -l이 경우에는 수학 함수가 사용되지 않으므로 실제로 필요하지 않음) :

for (( k = 0; k < 50; ++k )); do a=$( bc -l <<<"2*$k + 1" ) echo "$a" done 

bc -l를 co-process (백그라운드에서 일종의 계산 서비스처럼 작동합니다 ¹) :

coproc bc -l for (( k = 0; k < 50; ++k )); do printf "2*%d + 1\n" "$k" >&${COPROC[1]} read -u "${COPROC[0]}" a echo "$a" done kill "$COPROC_PID" 

마지막 항목은 :

bc -l |& bc_pid="$!" for (( k = 0; k < 50; ++k )); do print -p "2*$k + 1" read -p a print "$a" done kill "$bc_pid" 

¹ 이렇게하면 많은 양의 입력을 처리해야하는 문제가 한 번 해결되었습니다. 루프. 처리에는 약간의 부동 소수점 계산이 필요했지만 루프에서 bc를 몇 번 생성하는 것은 매우 느린 것으로 판명되었습니다. 예, 여러 가지 방법으로 해결할 수 있었지만 지루했습니다 …

답변

다음과 같이 단순화 할 수 있습니다.

a=$(($((2*$k))+1)); 

받는 사람 :

a=$((2*k+1)) 

답변

let 명령을 사용하여 강제로 계산할 수 있습니다.

let a="2*k+1" 

이 구조에서는 $k가 필요하지 않습니다. 간단한 k 만 있으면됩니다.

의견

  • 현재 파일에 ' a=2whateverk+1라는 파일이 있으면 실패합니다. 더 나쁜 것은 ' a=2+b[$(reboot)]k+1라는 파일이있는 경우 reboot 명령을 호출합니다. . 여기에서 ((...)) (((a = 2 * k + 1))) 또는 POSIX 구문을 사용하는 것이 가장 좋습니다. a=$((2 * k + 1))
  • 우리는 그것을 인용 할 수 있습니다; let a="2*k+1" 그것을 해결하세요.

답변

필요한 산술 확장은 다음과 같습니다.

a=$(( 1+2*k )) 

사실 변수를 사용할 필요가 없습니다.

for k in {0..49}; do echo "$(( 1 + 2*k ))" done 

또는 계수 변수를 for ((…)) 루프 :

for (( k=0;k<50;k++ )); do a=$(( 1+2*k )) printf "%s\n" "$a" done 

for ((…)) 루프

그리고이 경우 산술 확장은 다음과 같을 수도 있습니다. for 루프 내부로 이동 :

for (( k=0 ; a=1+2*k , k<50 ; k++)); do printf "%s\n" "$a" done 

또는 배열의 모든 값을 가져 오려면 :

for (( k=0 ; a[k]=1+2*k , k<49 ; k++ )); do :; done printf "%s\n" "${a[@]}" 

공식 없음

하지만 산술 확장을 방지하는 가장 짧은 방법은 변수를 두 번 증가시키는 것입니다.

for (( k=0,a=1 ; k<50 ; k++,a++,a++ )); do printf "%s\n" "$a" done 

또는 더 간단하게 seq를 사용하세요.

seq 1 2 100 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다