我最近一直在尝试创建一个可以将二进制数转换为十进制的脚本。这是我目前得到的:
#!/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
我知道这是一个很长的脚本。但请花点时间仔细阅读一下。
如果您查看read
if 条件中的任意一行,您将看到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 变量名必须至少3
read
开始以字母或下划线结尾时,扩展名$1
、$2
等$3
保留给 shell 的位置参数。
如果您确实想在脚本中使用$1
... $n
,您实际上可以使用 shell 内置命令来实现set
。请注意,POSIX 仅要求支持最多 的参数$9
,而 bash 支持任意数字(尽管对于超过 9 的索引,您需要使用括号来消除歧义,例如,${10}
作为第 10 个位置参数和作为和文字$10
的连接)。例如:$1
0
#!/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
注意不同的索引;虽然两个数组都是从零开始的,但第零个元素$@
保留用于脚本文件的名称。