0999:值对于基数而言太大(错误标记为“0999”)
0999: Value too great for base (error token is "0999")
这是一个脚本的简化版本,用于从 EXB-8500 读取 8 毫米磁带,并附有自动加载器(一次最多只能读取 10 盘磁带)。它位于磁带数据(直接二进制)中,并将其保存到我们的主存储和备份中以磁带的 4 位数字(例如 D1002.dat)命名的文件中。在此期间,它会记录信息并在终端中显示其状态,这样我们就可以看到它走了多远。
#!/bin/bash
echo "Please enter number of tapes: [int]"
read i
j=1
until [ $i -lt $j ]
do
echo "What is the number of tape $j ?"
read Tape_$j
(( j += 1 ))
done
echo "Load tapes into the tower and press return when the drive is ready"
read a
j=1
until [ $i -lt $j ]
do
k="Tape_$j"
echo "tower1 $j D$(($k)) `date` Begin"
BEG=$j" "D$(($k))" "`date`" ""Begin"
echo "tower1 $j D$(($k)) `date` End"
END=$j" "D$(($k))" "`date`" ""End"
echo "$BEG $END"
echo "$BEG $END"
sleep 2
(( j += 1 ))
done
echo "tower1 done"
在我们低于 1000(从 0999 开始)之前,一切都很顺利。错误代码为 ./tower1: 0999: Value too great for base (error token is "0999")
。现在我已经意识到这是因为当我输入前导 0 时脚本强制使用八进制值,并且我知道我应该在脚本中的某处插入一个 10#
,但问题是:Where?
我还有办法将 Tape_$j
定义为字符串吗?我觉得这样可以解决很多问题
为了得到错误,运行 脚本,定义你想要的任意数量的磁带(至少一个,lol),并在磁带名称中插入前导 0
示例:
./test
Please enter number of tapes: [int]
1
What is the number of tape 1?
0999
./test: 0999: Value too great for base (error token is "0999")
您不想将 $k 用作数字,而是用作字符串。您使用数值表达式将变量值作为变量名求值。这是非常糟糕的做法。
幸运的是,您可以在 bash 中使用变量间接寻址来实现您的目标。不涉及数字,不抛出错误。
echo "tower1 $j ${!k} `date` Begin"
BEG=$j" "D${!k}" "`date`" ""Begin"
其他地方也一样。
这是一个脚本的简化版本,用于从 EXB-8500 读取 8 毫米磁带,并附有自动加载器(一次最多只能读取 10 盘磁带)。它位于磁带数据(直接二进制)中,并将其保存到我们的主存储和备份中以磁带的 4 位数字(例如 D1002.dat)命名的文件中。在此期间,它会记录信息并在终端中显示其状态,这样我们就可以看到它走了多远。
#!/bin/bash
echo "Please enter number of tapes: [int]"
read i
j=1
until [ $i -lt $j ]
do
echo "What is the number of tape $j ?"
read Tape_$j
(( j += 1 ))
done
echo "Load tapes into the tower and press return when the drive is ready"
read a
j=1
until [ $i -lt $j ]
do
k="Tape_$j"
echo "tower1 $j D$(($k)) `date` Begin"
BEG=$j" "D$(($k))" "`date`" ""Begin"
echo "tower1 $j D$(($k)) `date` End"
END=$j" "D$(($k))" "`date`" ""End"
echo "$BEG $END"
echo "$BEG $END"
sleep 2
(( j += 1 ))
done
echo "tower1 done"
在我们低于 1000(从 0999 开始)之前,一切都很顺利。错误代码为 ./tower1: 0999: Value too great for base (error token is "0999")
。现在我已经意识到这是因为当我输入前导 0 时脚本强制使用八进制值,并且我知道我应该在脚本中的某处插入一个 10#
,但问题是:Where?
我还有办法将 Tape_$j
定义为字符串吗?我觉得这样可以解决很多问题
为了得到错误,运行 脚本,定义你想要的任意数量的磁带(至少一个,lol),并在磁带名称中插入前导 0
示例:
./test
Please enter number of tapes: [int]
1
What is the number of tape 1?
0999
./test: 0999: Value too great for base (error token is "0999")
您不想将 $k 用作数字,而是用作字符串。您使用数值表达式将变量值作为变量名求值。这是非常糟糕的做法。
幸运的是,您可以在 bash 中使用变量间接寻址来实现您的目标。不涉及数字,不抛出错误。
echo "tower1 $j ${!k} `date` Begin"
BEG=$j" "D${!k}" "`date`" ""Begin"
其他地方也一样。