![So fügen Sie einer Zahl eine Zeichenfolge hinzu](https://rvso.com/image/1072602/So%20f%C3%BCgen%20Sie%20einer%20Zahl%20eine%20Zeichenfolge%20hinzu.png)
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 read
Zeilen innerhalb der if-Bedingung ansehen, werden Sie feststellen, dass die Variablen, denen die read
Anweisungen 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 ]]; then
Anweisung 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 n
der Zahl in der Variablen hinzuzufügen $digitno
. Aber ich habe mich gefragt, ob jemand von Ihnen vielleicht herausfinden kann, wie man die Zeichenfolge n
der $digitno
Variablen 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
, 3
usw. verwenden read
. Abgesehen davon, dass Bash-Variablennamen mindestensbeginnenmit einem alphabetischen Zeichen oder einem Unterstrich, die Erweiterungen $1
, $2
, $3
usw. sind für die Shell reserviert.Positionsparameter.
$1
Wenn Sie wirklich ... $n
in Ihrem Skript verwenden möchten , können Sie dies tatsächlich mit dem set
integrierten 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 $10
der Verkettung von $1
mit 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 0
und 1
Zeichen 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.