如何将字符串添加到数字

如何将字符串添加到数字

我最近一直在尝试创建一个可以将二进制数转换为十进制的脚本。这是我目前得到的:

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

我知道这是一个很长的脚本。但请花点时间仔细阅读一下。

如果您查看readif 条件中的任意一行,您将看到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 变量名必须至少3read开始以字母或下划线结尾时,扩展名$1$2$3保留给 shell 的位置参数

如果您确实想在脚本中使用$1... $n,您实际上可以使用 shell 内置命令来实现set。请注意,POSIX 仅要求支持最多 的参数$9,而 bash 支持任意数字(尽管对于超过 9 的索引,您需要使用括号来消除歧义,例如,${10}作为第 10 个位置参数和作为和文字$10的连接)。例如:$10

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

注意不同的索引;虽然两个数组都是从零开始的,但第零个元素$@保留用于脚本文件的名称。

相关内容