배쉬 곱셈과 덧셈

배쉬 곱셈과 덧셈
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done

안녕하세요, 세 번째 줄에 대한 단순화된 표현이 필요합니다. 아마도 명령 대체를 사용하지 않는 표현이 필요할 것입니다.

답변1

산술 확장을 사용합니다.

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공동 프로세스 로 사용됩니다 (해당 역할은 백그라운드의 컴퓨팅 서비스와 유사합니다).

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"

마지막 것은 (아마도) 더 깨끗해 보입니다 ksh93.

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"

1 이는 루프에서 많은 양의 입력을 처리해야 하는 문제를 한때 해결했습니다. 처리에는 일부 부동 소수점 계산이 필요하지만 bc루프에서 이를 몇 번 생성하면 속도가 매우 느려집니다. 예, 이 문제는 다른 여러 가지 방법으로 해결할 수 있지만 지루합니다...

답변2

다음을 단순화할 수 있습니다.

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

도착하다:

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

답변3

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

let a="2*k+1"

이 구조에 있을 필요는 없습니다 $k. 간단한 구조로 k작업을 수행할 수 있습니다.

답변4

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

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

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

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

또는 count 변수를 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

관련 정보