숫자에 문자열을 추가하는 방법

숫자에 문자열을 추가하는 방법

나는 최근에 이진수를 십진수로 변환할 수 있는 스크립트를 만들려고 했습니다. 이것이 내가 지금까지 얻은 것입니다:

#!/bin/bash

echo "Specify no of digits"
read digits

if [[ $digits == 1 ]]; then
        echo "Enter 1 st digit"
        read 1
elif [[ $digits == 2 ]]; then
        echo "Enter 1 st digit"
        read 1
        echo "Enter 2 nd digit"
        read 2
elif [[ $digits == 3 ]]; then
        echo "Enter 1 st digit"
        read 1
        echo "Enter 2 nd digit"
        read 2
        echo "Enter 3 rd digit"
        read 3
elif [[ $digits > 3 ]]; then
        echo "Enter 1 st digit"
        read 1
        echo "Enter 2 nd digit"
        read 2
        echo "Enter 3 rd digit"
        read 3
        for digitno in {4..$digits};
        do
                echo "Enter $digitno th digit"
                read $digitno
                ($nodigits++)
        done
echo "$4"
else
        echo "Please enter a valid no of digits. Type './binary_decoder.sh'"
        exit 1
fi

꽤 긴 대본이라는 걸 알아요. 하지만 시간을 내어 이 스크립트를 검토해 보시기 바랍니다.

readif 조건문 내부의 행을 살펴보면 read명령문이 숫자를 할당하는 변수 자체가 숫자임을 알 수 있습니다. Bash 구문을 사용하면 작동하지 않습니다. 나는 변수가 n1, n2, n3, n4... 등과 같기를 원합니다. 그러나 명령문 내부를 보면 elif [[ $digits > 3 ]]; then무한한 숫자를 디코딩할 수 있는 for 루프가 있음을 알 수 있습니다. 이제 n변수의 숫자에 문자열을 추가하는 방법을 모르겠습니다 $digitno. 하지만 혹시 여러분 중 누군가가 변수 n에 문자열을 추가하는 방법을 알아낼 수 있는지 궁금합니다 $digitno.

도움을 주시면 감사하겠습니다.

답변1

간단한 연결을 사용하여 숫자에 문자열을 추가할 수 있습니다.

$ i=3
$ echo n$i
n3

그러나 그것은 여기서 당신의 실제 목표에 별로 도움이 되지 않습니다.불확실한 수의 사용자 입력을 인덱스 변수에 할당하는 방법.

이미 발견했듯이 명령 에는 1, 등의 변수 2를 사용할 수 없습니다 . bash 변수 이름은 최소한3read시작하다알파벳 문자 또는 밑줄이 있는 확장 $1, $2, $3등은 쉘용으로 예약되어 있습니다.위치 매개변수.

스크립트에서 $1...을 정말로 사용하고 싶다면 쉘 내장을 사용하여 실제로 그렇게 할 수 있습니다. POSIX는 최대 매개변수에 대한 지원만 요구하는 반면 , bash는 임의의 숫자를 지원합니다(비록 9보다 큰 인덱스의 경우 예를 들어 10번째 위치 매개변수와 리터럴과 의 연결을 구분하기 위해 중괄호를 사용해야 합니다 ). . 예를 들어:$nset$9${10}$10$10

#!/bin/bash

set --
while : ; do
  read -n1
  case $REPLY in
    [01]) set -- "$@" "$REPLY"
    ;;
    *) break
    ;;
  esac
done

for ((i=1; i<=$#; ++i)); do
  printf 'Digit #%d = %d\n' "$i"  "${!i}"
done

0사용자는 및 문자 시퀀스를 입력하고 1다른 문자(개행 포함)를 눌러 시퀀스를 종료합니다.

$ ./bin2dec
1011010110
Digit #1 = 1
Digit #2 = 0
Digit #3 = 1
Digit #4 = 1
Digit #5 = 0
Digit #6 = 1
Digit #7 = 0
Digit #8 = 1
Digit #9 = 1
Digit #10 = 0

또는 사용자 정의 배열을 사용하여 본질적으로 동일한 작업을 수행할 수 있습니다.

#!/bin/bash

arr=()
while : ; do
  read -n1
  case $REPLY in
    [01]) arr+=("$REPLY")
    ;;
    *) break
    ;;
  esac
done

for ((i=0; i<${#arr[@]}; ++i)); do
  printf 'Digit #%d = %d\n' "$i"  "${arr[i]}"
done

다양한 인덱싱에 주목하세요. 두 배열 모두 0부터 시작하지만 의 0번째 요소는 $@스크립트 파일 이름으로 예약되어 있습니다.

관련 정보