![숫자에 문자열을 추가하는 방법](https://rvso.com/image/1072602/%EC%88%AB%EC%9E%90%EC%97%90%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 최근에 이진수를 십진수로 변환할 수 있는 스크립트를 만들려고 했습니다. 이것이 내가 지금까지 얻은 것입니다:
#!/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
꽤 긴 대본이라는 걸 알아요. 하지만 시간을 내어 이 스크립트를 검토해 보시기 바랍니다.
read
if 조건문 내부의 행을 살펴보면 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 변수 이름은 최소한3
read
시작하다알파벳 문자 또는 밑줄이 있는 확장 $1
, $2
, $3
등은 쉘용으로 예약되어 있습니다.위치 매개변수.
스크립트에서 $1
...을 정말로 사용하고 싶다면 쉘 내장을 사용하여 실제로 그렇게 할 수 있습니다. POSIX는 최대 매개변수에 대한 지원만 요구하는 반면 , bash는 임의의 숫자를 지원합니다(비록 9보다 큰 인덱스의 경우 예를 들어 10번째 위치 매개변수와 리터럴과 의 연결을 구분하기 위해 중괄호를 사용해야 합니다 ). . 예를 들어:$n
set
$9
${10}
$10
$1
0
#!/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번째 요소는 $@
스크립트 파일 이름으로 예약되어 있습니다.