如何修复Bash错误‘56949f: value too great for base’
Bash数值解析错误解决
问题
运行Bash代码时出现错误:line 36: 56949f: value too great for base (error token is "56949f")
代码用于定义颜色数组并引用变量,预期输出为#56949f,已知需要强制十进制解析但不清楚设置位置,求解决。
原始代码
rosepine=("191724" "1f1d2e" "26233a" "6e6a86" "908caa" "e0def4" "eb6f92" "f6c177" "ebbcba" "31748f" "9ccfd8" "c4a7e7" "21202e" "403d52" "524f67") rosepinemoon=("232136" "2a273f" "393552" "6e6a86" "908caa" "e0def4" "eb6f92" "f6c177" "ea9a97" "3e8fb0" "9ccfd8" "c4a7e7" "2a283e" "44415a" "56526e") rosepinedawn=("faf4ed" "fffaf3" "f2e9e1" "9893a5" "797593" "575279" "b4637a" "ea9d34" "d7827e" "286983" "56949f" "907aa9" "f4ede8" "dfdad9" "cecacd") base=0 surface=1 overlay=2 muted=3 subtle=4 text=5 love=6 gold=7 rose=8 pine=9 foam=10 iris=11 hltlow=12 hltmed=13 hlthigh=14 #test colours show_colour() { perl -e 'foreach $a(@ARGV){print "\e[48:2::".join(":",unpack("C*",pack("H*",$a)))."\m \e[49m "};print "\n"' "$@" } theme="rosepinedawn" basec="text" outlinec="subtle" wheelc="foam" xbc="'#$[$theme[$[$basec]]]'" xoc="'#$[$theme[$[$outlinec]]]'" xwc="'#$[$theme[$[$wheelc]]]'" echo $xwc
错误原因
$[ ... ]是Bash的旧式算术扩展语法,会将内部内容当作数值计算。当解析$theme[$[$wheelc]]时,$wheelc对应的值是10,因此会解析为$rosepinedawn[10],其值为56949f。Bash看到包含f的字符串,会尝试按十六进制解析,但十六进制数必须以0x开头,因此触发"数值超出基数范围"的错误。
解决方法
不需要使用算术扩展,改用间接变量引用来获取动态数组的元素:
将最后三行变量赋值修改为:
xbc="#${!theme[$basec]}" xoc="#${!theme[$outlinec]}" xwc="#${!theme[$wheelc]}"
或者使用eval(注意转义):
xbc="#$(eval echo \${$theme[$basec]})" xoc="#$(eval echo \${$theme[$outlinec]})" xwc="#$(eval echo \${$theme[$wheelc]})"
修改后执行echo $xwc,即可得到预期输出#56949f。
内容的提问来源于stack exchange,提问作者Hari Shankar
相关产品推荐
相关产品推荐

