So fügen Sie einer Zahl eine Zeichenfolge hinzu

So fügen Sie einer Zahl eine Zeichenfolge hinzu

Ich habe kürzlich versucht, ein Skript zu erstellen, das eine Binärzahl in eine Dezimalzahl umwandeln kann. Das ist mein bisheriges Ergebnis:

#!/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

Ich weiß, dass es ein ziemlich langes Skript ist. Aber nehmen Sie sich bitte die Zeit, es genauer zu untersuchen.

Wenn Sie sich eine der readZeilen innerhalb der if-Bedingung ansehen, werden Sie feststellen, dass die Variablen, denen die readAnweisungen die Zahlen zuweisen, selbst Zahlen sind. Mit der Bash-Syntax funktioniert das nicht. Ich möchte, dass die Variablen wie n1, n2, n3, n4 usw. sind. Aber wenn Sie sich die elif [[ $digits > 3 ]]; thenAnweisung ansehen, können Sie sehen, dass es eine for-Schleife gibt, die das Dekodieren einer unendlichen Anzahl von Ziffern ermöglicht. Nun, ich kenne keine Möglichkeit, die Zeichenfolge nder Zahl in der Variablen hinzuzufügen $digitno. Aber ich habe mich gefragt, ob jemand von Ihnen vielleicht herausfinden kann, wie man die Zeichenfolge nder $digitnoVariablen hinzufügt.

Jede Hilfe wird geschätzt.

Antwort1

Sie können einer Zahl eine Zeichenfolge durch einfache Verkettung hinzufügen:

$ i=3
$ echo n$i
n3

das hilft Ihnen jedoch nicht viel bei Ihrem eigentlichen Ziel, nämlichSo weisen Sie indizierten Variablen eine unbestimmte Anzahl von Benutzereingaben zu.

Wie Sie bereits festgestellt haben, können Sie in einem Befehl keine Variablen mit den Namen 1, 2, 3usw. verwenden read. Abgesehen davon, dass Bash-Variablennamen mindestensbeginnenmit einem alphabetischen Zeichen oder einem Unterstrich, die Erweiterungen $1, $2, $3usw. sind für die Shell reserviert.Positionsparameter.

$1Wenn Sie wirklich ... $nin Ihrem Skript verwenden möchten , können Sie dies tatsächlich mit dem setintegrierten Shell-Befehl tun. Beachten Sie, dass POSIX nur die Unterstützung von Parametern bis erfordert $9, während Bash eine beliebige Zahl unterstützt (obwohl Sie für Indizes über 9 Klammern verwenden müssen, um zwischen beispielsweise ${10}dem 10. Positionsparameter und $10der Verkettung von $1mit dem Literal zu unterscheiden 0). Beispiel:

#!/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

Der Benutzer gibt eine Folge von 0und 1Zeichen ein und beendet die Folge durch Drücken eines beliebigen anderen Zeichens (einschließlich Zeilenumbruch):

$ ./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

Alternativ können Sie im Wesentlichen dasselbe mit einem benutzerdefinierten Array tun:

#!/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

Beachten Sie die unterschiedliche Indizierung; obwohl beide Arrays nullbasiert sind, $@ist das nullte Element für den Namen der Skriptdatei reserviert.

verwandte Informationen