그래서 나는 내가 부르는 것(공식 명칭인지 확실하지 않음)을 "카운터"로 만들고 기본적으로 특정 범위나 숫자와 관련된 작업을 수행하는 데 익숙합니다.
#!/bin/bash -x
get_total2=$(echo "$@")
while [ $get_total2 -gt 0 ]; do
echo $get_total2
get_total2=$(expr $get_total2 - 1)
done
사용 예 echo
.
그러나 코드에서 볼 수 있듯이 이는 "정상" 카운터(일반적인 순서와 마찬가지로)가 아니라 역 카운터입니다... 나는 이 작업을 수행하는 방법을 결코 알아내지 못했습니다. 비록 이것이 쉽다고 확신하지만, 그냥 지나치게 생각하는 것뿐입니다.
위 코드를 역순 대신 "일반" 계산으로 작동하게 하려면 어떻게 해야 합니까?
답변1
for
루프를 사용하여 bash에서 계산할 수 있습니다 . 예를 들어 다음을 고려하십시오.
#!/bin/bash -x
total="${1}"
for ((i = 0; i < total; ++i)); do
echo "${i}"
done
실행하면 다음과 같은 결과를 얻습니다.
$ ./ex.sh 3
0
1
2
$
루프 for
는 다음과 같이 구성됩니다.
for ((init; condition; update))
- 이
init
부분은 루프가 시작되고 변수를 초기화하기 전에 한 번 실행됩니다. condition
이 섹션은 루프를 통과할 때마다 평가됩니다. 조건이 다음과 같을 때false
루프가 중지됩니다 .update
이 섹션은 루프를 통과할 때마다 평가됩니다.++i
짧은 형식입니다i = i + 1
이 경우 루핑을 통해 다음과 같은 일련의 단계를 얻게 됩니다.
i = 0
0 < 3
-> 맞다echo 0
++i
(i = i + 1
) # i는 1이 된다1 < 3
-> 맞다echo 1
++i
(i = i + 1
) # i는 2가 된다- '2 < 3` -> 참
echo 2
++i
(i = i + 1
) # 나는 3이 된다3 < 3
-> false # 루프가 종료됩니다.
답변2
여기에는 네 가지 옵션이 있습니다. 처음 두 개는 bash용이며 하나는 아래로 하나는 위입니다.
다음 두 루프는 POSIX sh(및 bash에서도)에서 작동합니다.
다시 하나는 카운트다운하고 다른 하나는 카운트업합니다.
#!/bin/bash -
n=${1:-10}
for ((i=n-1;i>=0;i--)) ; do printf ' %s ' "$i"; done; echo
for ((i=0;i<n;i++)) ; do printf ' %s ' "$i"; done; echo
i=$n; while [ "$((i-=1))" -ge "0" ] ; do printf ' %s ' "$i"; done; echo
i=-1; while [ "$((i+=1))" -lt "$n" ] ; do printf ' %s ' "$i"; done; echo
스크립트를 실행한 결과는 다음과 같습니다.
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
송곳
처음 두 루프는 bash, ksh 및 zsh에서 사용할 수 있는 for 루프를 사용합니다.
for (( start ; test ; execute )); do
따라서 의 값은
n
첫 번째 매개변수가 있으면 해당 값으로 설정되고, 없으면 10으로 설정됩니다. n이 10으로 설정되어 있다고 가정합니다.for 루프는 (카운터)를 : 또는 9
i
보다 작은 1로 설정합니다.$n
i=n-1
테스트 구간을 실행하여 비교
9
하였습니다 .>=
0
printf는
i
of로 실행되어 인쇄됩니다9
.9
루프의 마지막 실행 부분이 실행되고 i가 감소됩니다
i--
.루프를 다시 테스트하고 결과
8
는 다음과 같습니다.>=
0
printf가 실행되고 8이 인쇄됩니다.
처형 되다
i--
,i
~이 되다7
.i
가 될 때까지 반복합니다0
.0
is>=
비율0
(이 경우 같음) 에 대한 테스트는 그대로 유지됩니다 .인쇄해
0
보세요.감소 시
i--
i는 다음-1
과 같습니다.이제 테스트가 실패하고
-1
있습니다 .아니요>=
비교하다0
루프가 종료되었습니다.
마지막
echo
라인을 실행하고 다음 라인으로 이동합니다.
최종 결과: 9 대 0이 같은 줄에 인쇄되었습니다.9 8 7 6 5 4 3 2 1 0
루프 2
두 번째 주기는 여러분이 요청한 상승 주기입니다. 위와 매우 유사하지만 0에서 시작하여 9에서 끝납니다. `0 1 2 3 4 5 6 7 8 9`를 인쇄하세요.루프 3
n
10으로 설정합니다(스크립트에 다른 매개변수를 제공하도록 변경될 수 있음).i
이 값으로 설정됩니다i=$n
.- 다음 test(
[...]
)가 true일 때 printf가 실행된다. - 테스트에서 가장 먼저 할
i
일은1
.i-=1
로 확장합니다i = i - 1
(i--
에서는 사용할 수 없음sh
). 이는 산술 확장에 포함되어$((...))
있으며 인용되어 있습니다(IFS 문제를 피하기 위해). 이 산술 확장으로 인해9
다음i
루프에 대해 이 값이 유지됩니다. - 값의
9
수치 비교를 수행하여 값-ge
이 맞는지 확인합니다.G중계기 또는두번째동일한"0"
. - 이와 같이
9
printf가 실행되어 인쇄됩니다.>=
"0"
9
- 루프가 반복되고 이제 는 과 마이너스 1이
i
됩니다 .9
8
- 여전히
8
8이 인쇄됩니다.>=
"0"
i
로 줄어들 때까지 반복합니다0
. 테스트는 여전히 참이므로 값은0
still>=
(이 경우 같음) 입니다"0"
. A0
가 인쇄됩니다.- 카운터는
-1
테스트 실패를 유발하는 값으로 줄어들고 루프가 종료됩니다.
루프 4
위와 거의 동일한 루프이지만 위쪽으로 계산됩니다.답변3
다음과 같이 작동해야 합니다.
#!/bin/bash -x
get_total2=$(echo "$@")
count=0
while [ $count -lt $get_total2 ]; do
echo $count
count=$(expr $count + 1)
done
메시지가 표시되면 계산을 중지하려면 숫자를 입력해야 합니다. 구문 오류가 있을 수 있지만 확인하지 않았습니다. 이 작업을 수행하는 더 쉬운 방법이 있을 수도 있습니다.
답변4
ing을 사용 ((i++))
하거나 ((++i))
직접 사용하는 다른 변형echo
대괄호를 사용하세요.
#!/bin/bash
total="$1" i=0
echo -n "Using i++: "
while [ $i -lt $total ]; do echo -n " $((i++)) "; done; echo
i=0
echo -n "Using ++i: "
while [ $i -lt $total ]; do echo -n " $((++i)) "; done; echo
산출:
$ ./count.sh 5
Using i++: 0 1 2 3 4
Using ++i: 1 2 3 4 5
사용 c-style
:
total="$1"
while (( i < total )); do
echo -n " $((i++)) " # or " $((++i)) "
done; echo
# total: 5
# output i++: 0 1 2 3 4
# output ++i: 1 2 3 4 5
또는 다음을 사용할 수 있습니다 until
.
until (( i == total )); do echo -n " $((i++)) "; done; echo
# count.sh 5
# output: 0 1 2 3 4
몇 가지 설명:
echo $((i++))
먼저 인쇄한 다음 증가하며 그 echo $((++i))
반대도 마찬가지입니다.
따라서 x
초기 값이 0
이렇게 하면 echo $((i++))
인쇄 0
되고 x
가 됩니다 1
. 입증하다:
$ echo $((x++))
0
$ echo $x
1
$ echo $((++x))
2
$ echo $x
2