基数值太大(错误标记为"08")

Tha*_*raj 59 bash shell

这里我的问题是在if语句中找到使用单括号[]和双括号[[]]的区别.

#!/bin/bash
vara=08;
varb=10;

## single bracket in if statment is working.
if [ $vara -lt $varb ]; then
echo "yes";
else
echo "no";
fi


## double brackets in if statment is not working; throwing an error like below.
## [[: 08: value too great for base (error token is "08")
if [[ $vara -lt $varb ]]; then
echo "yes";
else
echo "no";
fi
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnB 102

shell尝试将08解释为八进制数,因为它以零开头.但是,在八进制中只允许数字0-7,因为十进制8是八进制010.因此08不是有效数字,这就是错误的原因.

单括号是sh的"兼容模式",sh不知道八进制数.

因此,如果使用单个方括号,"010"将被解释为10,而使用双方括号,"010"将被解释为8.

如果使用单个方括号,"08"将被解释为8,而使用双方括号时,它不是有效数字并导致错误.

您可以使用此处描述的解决方案来避免错误:https://stackoverflow.com/a/12821845/1419315

if [[ ${vara#0} -lt ${varb#0} ]]
Run Code Online (Sandbox Code Playgroud)

要么

if [[ $((10#$vara)) -lt $((10#$varb)) ]]
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用_n#_显式指定数字基数,因此将识别"10#08". (10认同)
  • 问题是前导0,这将导致Shell将字符串解释为八进制。试试这个http://stackoverflow.com/a/12821845/1419315解决方案:`if [[$ {vara#0} -lt $ {varb#0}]] (4认同)
  • 谢谢!这似乎也适用于任何算术表达式,例如。`$(( 10#$vara - 8 ))` (3认同)
  • 这也有效: VariableWithLeadingZero=$(echo $VariableWithLeadingZero | sed 's/^0*//') (2认同)
  • `[[ ${vara#0} -lt ${varb#0} ]]` 会中断带有多个前导零的数字(例如 `008`)。`[[ 10#$vara -lt 10#$varb ]]` 或 `(( 10#$vara < 10#$varb ))` 适用于此类数字。 (2认同)