我遇到了替换变量名的问题。这是我的程序
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的整个字符串内容是什么问题
答案 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