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
C
가 아니라bash
이므로 모든;
-한 줄로 작성하지 않는 경우declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
는 명령 대체가 아닌 산술 확장입니다.