【问题标题】:Bash: value too great for base (string with numbers)Bash:值对于基数来说太大了(带数字的字符串)
【发布时间】:2014-09-04 03:31:52
【问题描述】:

看起来这是一个常见问题,但我没有找到适合我的特定场景的解决方案:

我的脚本有许多参数,它们是带有前导数字的字符串。然后,该脚本逐行遍历输入流,以查看用户的参数是否包含在输入流中。不幸的是,我的 if 语句出现错误,例如

...值对于 base 来说太大(错误标记是“21000E1E06F54F”)...

#get user arguments
MyArray+=($OPTARG)

#for each array element, loop through an input looking for the string 
read <&3
if [[ $REPLY == *${MyArray[$i]}* ]]; then 
  found=1
fi

参数的一个例子是:21000E1E06F54F,但我不敢说它总是十六进制的——我宁愿把它当作一个字符串。显然,我可以在 $OPTARG 之前放一个字母,但是字符串比较关闭,否则我需要添加代码来解决添加的字母。关于如何解决这个问题的任何想法?我希望可以添加一些简单的语法来将变量转换为字符串...

谢谢,

【问题讨论】:

  • 你确定这是错误的来源吗?我似乎不能在这里失败。那里的循环代码是什么样的?您是否在任何地方的算术上下文$((...)) 中使用该输入/参数?
  • 向我们展示您在哪里使用该值。
  • 引用错误信息时,不要缩写为...。向我们显示确切的完整错误消息。

标签: bash


【解决方案1】:

问题是您正在循环数组值,但随后尝试将数组 value 用作数组 index:

这是一个例子:

MyArray=(21000E1)
REPLY="FOO21000E1FOO"
for i in "${MyArray[@]}"
do
  if [[ $REPLY == *${MyArray[$i]}* ]]
  then
    echo "found"
  fi
done

这会导致:

bash: 21000E1: value too great for base (error token is "21000E1")

以下是引用相同值的三种方式:

$i              # Correct, uses value directly
${MyArray[0]}   # Correct, looks up value using the value's index
${MyArray[$i]}  # WRONG,   tries to look up value using value as index

由于$i已经是值而不是索引,直接使用即可:

MyArray=(21000E1)
REPLY="FOO21000E1FOO"
for i in "${MyArray[@]}"
do
  if [[ $REPLY == *"$i"* ]]
  then
    echo "found"
  fi
done

这导致found

【讨论】:

  • 我明白了...我没有意识到 $i 的值是元素而不是索引!菜鸟的错误 :) 感谢您发现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2021-06-02
相关资源
最近更新 更多