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