Como adicionar uma string a um número

Como adicionar uma string a um número

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 readlinhas dentro da condicional if, verá que as variáveis ​​às quais as readinstruçõ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 ]]; theninstruçã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 nao número na variável $digitno. Mas eu queria saber se algum de vocês pode descobrir como adicionar a string nà $digitnovariá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, 3etc. em um readcomando. 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, $2e $3assim por diante são reservadas para o shellparâmetros posicionais.

Se você realmente deseja usar $1... $nem seu script, você pode fazê-lo usando o setshell 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 $10como a concatenação de $1com 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 0e 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.

informação relacionada