看起来这是一个常见问题,但我没有看到适用于我的具体情况的解决方案:
我的脚本采用了许多参数,这些参数是带有前导数字的字符串。然后,脚本逐行循环遍历输入流,以查看用户的参数是否包含在输入流中。不幸的是,我收到了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之前放一个字母,但后来字符串比较关闭或者我需要添加代码来解决添加的字母。有关如何解决此问题的任何想法?我希望可以添加一些简单的语法来将变量转换为字符串......
谢谢,
答案 0 :(得分:2)
问题是你是在循环数组值,但是然后尝试将数组值用作数组 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
。