![Como adicionar uma string a um número](https://rvso.com/image/1072602/Como%20adicionar%20uma%20string%20a%20um%20n%C3%BAmero.png)
Recentemente, tenho tentado criar um script que possa converter um número binário em decimal. Isto é o que eu tenho até agora:
#!/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
É um roteiro bem longo, eu sei. Mas, por favor, tente reservar um tempo para examinar este script.
Se você observar qualquer uma das read
linhas dentro da condicional if, verá que as variáveis às quais as read
instruções estão atribuindo os números são elas próprias números. Com a sintaxe Bash, isso não funcionará. Quero que as variáveis sejam como n1, n2, n3, n4... e assim por diante. Mas, se você olhar dentro da elif [[ $digits > 3 ]]; then
instrução, verá que existe um loop for que permite que um número infinito de dígitos seja decodificado. Agora, não conheço nenhuma maneira de adicionar a string n
ao número na variável $digitno
. Mas eu queria saber se algum de vocês pode descobrir como adicionar a string n
à $digitno
variável.
Qualquer ajuda será apreciada.
Responder1
Você pode adicionar uma string a um número usando concatenação simples:
$ i=3
$ echo n$i
n3
no entanto, isso não ajuda muito com o seu objetivo real aqui, que parece sercomo atribuir um número indeterminado de entradas do usuário a variáveis indexadas.
Como você já descobriu, você não pode usar variáveis denominadas 1
, 2
, 3
etc. em um read
comando. Além do fato de que os nomes das variáveis bash devem pelo menoscomeçarcom um caractere alfabético ou sublinhado, as expansões $1
, $2
e $3
assim por diante são reservadas para o shellparâmetros posicionais.
Se você realmente deseja usar $1
... $n
em seu script, você pode fazê-lo usando o set
shell interno. Observe que enquanto o POSIX requer apenas suporte para parâmetros até $9
, o bash suporta um número arbitrário (embora para índices acima de 9 você precise usar colchetes para desambiguar entre, por exemplo, ${10}
como o 10º parâmetro posicional e $10
como a concatenação de $1
com literal 0
) . Por exemplo:
#!/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
O usuário insere uma sequência de caracteres 0
e 1
, encerrando a sequência pressionando qualquer outro caractere (incluindo nova linha):
$ ./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
Alternativamente, você poderia fazer essencialmente o mesmo com um array definido pelo usuário:
#!/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
Observe a indexação diferente; embora ambas as matrizes sejam baseadas em zero, o elemento zero $@
é reservado para o nome do arquivo de script.