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

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공동 처리 (는 background¹에서 계산 서비스의 일종처럼 행동)로 :

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"

¹ 이렇게하면 루프에서 많은 양의 입력을 처리해야하는 문제가 해결되었습니다. 처리에는 일부 부동 소수점 계산이 필요했지만 bc루프에서 몇 번 스폰 되는 것이 매우 느리다는 것이 입증되었습니다. 예, 다른 많은 방법으로 해결할 수 있었지만 지루했습니다 …


답변

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

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

에:

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

답변

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

let a="2*k+1"

$k이 구조 에서는 필요하지 않습니다 . 간단한 k일을 할 것입니다.


답변

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

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