Bash:价值对于基数来说太大了

时间:2018-02-18 19:50:21

标签: bash

我遇到了替换变量名的问题。这是我的程序

DEV1="d21f5600-0cd0-11e8-03e9461109ca"
echo $1
echo $2
if [[ $1 == "DEV1"  || $1 == "DEV2"  || $1 == "DEV3" ]] 
then
     echo "Correct ID"
     echo $1
     echo  "'$(($1))'"
else
     echo "Wrong ID"
fi

当我像这样运行程序时

bash test.sh DEV1

这是我得到的输出

DEV1

Correct ID
DEV1
test.sh: line 8: d21f5600-0cd0: value too great for base (error token is "0cd0")

打印DEV1的整个字符串内容是什么问题

2 个答案:

答案 0 :(得分:3)

$(( ))将其内容评估为算术表达式。在我看来,你试图用它来获取$1命名的变量的内容,但是把它当作一个简单的字符串而不是一个算术表达式。为此,您可以使用${!indirectvar}

进行间接展开
#!/bin/bash
DEV1="d21f5600-0cd0-11e8-03e9461109ca"
echo $1
echo $2
if [[ $1 == "DEV1"  || $1 == "DEV2"  || $1 == "DEV3" ]]
then
     echo "Correct ID"
     echo $1
     echo  "'${!1}'"    # Indirect expansion here
else
     echo "Wrong ID"
fi

请注意,我还添加了一个shebang行来表示它是一个bash脚本(不是普通的sh,perl等)。这个并添加执行权限(chmod +x test.sh)可让您使用./filename正确运行:

$ ./test.sh DEV1
DEV1

Correct ID
DEV1
'd21f5600-0cd0-11e8-03e9461109ca'
顺便说一下,还有一些我建议改变的事情:全帽变量名有点冒险,因为有很多全帽的环境变量有特殊意义,如果你不小心使用了一个它可以产生奇怪的效果。因此,较低或混合大小写的变量更安全。此外,通常不建议使用带脚本的文件扩展名(如.sh),因为shebang行是指示它所写语言的更好方式。但是test是一个重要的内置命令,你永远不想覆盖它,所以我建议为脚本使用一个不太通用的名称。

答案 1 :(得分:1)

重现错误的最小示例是

DEV1="d21f5600-0cd0-11e8-03e9461109ca"
echo  "'$(($DEV1))'"

$((...))是bashs算术评估。

echo $((d21f5600-1690-1118-43e9461109ca))

会导致同样的错误。

以算术方式评估十六进制值 - 我想这不是你想要做的 - 你必须在它们前面添加0x:

echo $((0xd21f5600-0x0cd0-0x11e8-0x03e9461109ca))
-4296912523906