Bash - 일반 카운터를 만드는 방법은 무엇입니까? [폐쇄]

Bash - 일반 카운터를 만드는 방법은 무엇입니까? [폐쇄]

그래서 나는 내가 부르는 것(공식 명칭인지 확실하지 않음)을 "카운터"로 만들고 기본적으로 특정 범위나 숫자와 관련된 작업을 수행하는 데 익숙합니다.

#!/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로 설정합니다.$ni=n-1

  • 테스트 구간을 실행하여 비교 9하였습니다 .>=0

  • printf는 iof로 실행되어 인쇄됩니다 9.9

  • 루프의 마지막 실행 부분이 실행되고 i가 감소됩니다 i--.

  • 루프를 다시 테스트하고 결과 8는 다음과 같습니다.>=0

  • printf가 실행되고 8이 인쇄됩니다.

  • 처형 되다 i--, i~이 되다 7.

  • i가 될 때까지 반복합니다 0.

  • 0is >=비율 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

  • n10으로 설정합니다(스크립트에 다른 매개변수를 제공하도록 변경될 수 있음).
  • i이 값으로 설정됩니다 i=$n.
  • 다음 test( [...])가 true일 때 printf가 실행된다.
  • 테스트에서 가장 먼저 할 i일은 1. i-=1로 확장합니다 i = i - 1( i--에서는 사용할 수 없음 sh). 이는 산술 확장에 포함되어 $((...))있으며 인용되어 있습니다(IFS 문제를 피하기 위해). 이 산술 확장으로 인해 9다음 i루프에 대해 이 값이 유지됩니다.
  • 값의 9수치 비교를 수행하여 값 -ge이 맞는지 확인합니다.G중계기 또는두번째동일한 "0".
  • 이와 같이 9printf가 실행되어 인쇄됩니다.>="0"9
  • 루프가 반복되고 이제 는 과 마이너스 1이 i됩니다 .98
  • 여전히 88이 인쇄됩니다.>="0"
  • i로 줄어들 때까지 반복합니다 0. 테스트는 여전히 참이므로 값은 0still >=(이 경우 같음) 입니다 "0". A 0가 인쇄됩니다.
  • 카운터는 -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

관련 정보