카운터를 사용하는 while 루프는 사용자가 입력한 정수를 활용합니다.

카운터를 사용하는 while 루프는 사용자가 입력한 정수를 활용합니다.

저는 스크립트를 작성 중인데 어느 시점에서 사용자 입력을 받아 다음과 같이 카운터를 정수 값으로 사용하고 싶습니다.

read -p "How many bytes would you like you replace :> " $numOfBytes
echo "$numOfBytes bytes to replace"
while [ $counter -le $numOfBytes ]
do
    echo "testing counter value = $counter"
    let $counter++
done

내가 이해한 바로는 numOfBytes 변수를 문자열로 처리하기 때문에 현재 작동하지 않습니다.

문자열을 int로 어떻게 변환해야 합니까? 이런 일이 가능합니까? 다른 옵션이 있나요?

답변1

정수를 읽고 1부터 해당 정수까지 루프를 수행하여 각 반복마다 숫자를 인쇄하려고 합니다.

#!/bin/bash

read -p 'number please: ' num

for (( i = 1; i <= num; ++i )); do
    printf 'counter is at %d\n' "$i"
done 

$값을 읽을 때는 사용되지 않습니다 . $var변수의 값을 얻었 지만 알아야 할 var사항read이름해당 값이 아닌 읽을 변수의 이름입니다.

또는 while 루프를 사용하세요.

#!/bin/bash

read -p 'number please: ' num

i=0
while (( ++i <= num )); do
    printf 'counter is at %d\n' "$i"
done

in은 산술 문맥 (( ... ))입니다 . bash이 경우 변수를 추가할 필요가 없으며 $변수 값은 정수로 해석됩니다.

또는 /bin/sh,

#!/bin/sh

printf 'number please: ' >&2
read num

i=1
while [ "$i" -le "$num" ]; do
    printf 'counter is at %d\n' "$i"
    i=$(( i + 1 ))
done

-le("작거나 같음") 테스트는 두 가지 모두에서 작동해야 합니다.선두변수 확장(이 코드에서). 예를 들어 따옴표로 묶지 않은 경우 [ $i -le $num ]두 변수 중 하나에 셸 와일드카드 문자나 공백이 포함되어 있으면 예기치 않은 결과나 오류가 발생할 수 있습니다. 또한 참조는 IFS변수에 숫자가 포함된 경우 숫자를 보호합니다.

관련 질문:

답변2

특정 문제를 해결하려면:

문자열을 int로 어떻게 변환해야 합니까?

내 대답은 아니오 야. 쉘 변수는 모두 문자열이지만 사용되는 상황에 따라 정수 또는 문자열로 처리될 수 있습니다. 명령 -le연산자 [(명령이라고도 함) 의 경우 test변수는 정수로 처리됩니다.

# integer comparison
$ var=25; test "$var" -le "$HOME"
bash: test: /home/username: integer expression expected
$ test "$var" -le 30 && echo Lower
Lower
# string comparison
$ test $var = 24 && echo 'same string' || echo 'different string'
different string
$ test $var = 25 && echo 'same string' || echo 'different string'
same string

스크립트는 counter변수를 초기화 하고 in $및 에서 제거 해야 합니다 .numOfBytesread$let

#!/bin/bash

read -p "How many bytes would you like you replace :> " numOfBytes
echo "$numOfBytes bytes to replace"
counter=0
while [ "$counter" -le "$numOfBytes" ]
do
    echo "testing counter value = $counter"
    let counter++
done

작동 방식은 다음과 같습니다.

$ ./counter.sh 
How many bytes would you like you replace :> 5
5 bytes to replace
testing counter value = 0
testing counter value = 1
testing counter value = 2
testing counter value = 3
testing counter value = 4
testing counter value = 5

let/ bash키워드 로 인해 ksh스크립트의 이식성이 떨어집니다 . 산술 확장을 사용하는 것이 좋습니다 counter=$((counter+1)).POSIX 쉘 언어 표준(섹션 2.6.4).

또한보십시오:https://askubuntu.com/a/939299/295286


~처럼스톰 드래곤셸 변수가 해당 컨텍스트에 따라 처리된다는 사실은 사용자의 입력을 삭제해야 함을 의미한다는 점을 지적하세요. 한 가지 가능한 접근 방식은 이식 numOfBytes가능한 선언을 case통합 하는 것입니다.이 답변, 입력이 실제로 숫자인지 확인하는 역할을 합니다.

답변3

Bash에는 실제로 할당 가능한 유형이 없습니다. 변수는 선언된 유형입니다. 따라서 변수를 로 선언하면 abc문자열이 됩니다. 로 선언되면 138int이다. Bash는 실제로 소수를 처리하지 않으므로 변수를 로 선언하면 138.0문자열로 처리됩니다.

0따라서 에서 까지 반복할 수 없으므로 사용자 입력에 주의해야 합니다 abc. 다음은 루프에서 오류 검사를 수행하고 바이트를 증가시키는 예입니다.

#!/bin/bash

# Handle non-numeric input
read -p "How many bytes would you like you replace :> " numOfBytes
while [[ ! "$numOfBytes" =~ ^[0-9]+$ ]]; do
    echo
    echo "Please enter whole numbers only:"
    read -p "How many bytes would you like you replace :> " numOfBytes
done

echo "$numOfBytes bytes to replace $numOfBytes"
for i  in $(seq $numOfBytes) ; do
    echo "i has been incremented to $i."
done
exit 0

관련 정보