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