bash - 为什么 "24 > 10#24"会生成错误 token ?

标签 bash

我有一个函数 vercomp 可以比较两个版本字符串并确定哪个版本更大。当我添加这个别名时:

alias grep='grep -EI --colour=always'

对于我的 bashrc 文件看似不相关的部分,我收到此错误:

-bash: 10#24 > 10#24: syntax error: invalid arithmetic operator (error token is "24 > 10#24")
-bash: 10#24 < 10#24: syntax error: invalid arithmetic operator (error token is "24 < 10#24")

请注意,错误被发出两次,我假设是因为错误被处理了两次(即这不是我的错字)。请注意,当我删除别名时,一切正常。 为什么会生成此错误以及如何缓解它?

下面感兴趣的行可能是标记的行:

    if ((10#${ver1[i]} > 10#${ver2[i]})); then
        return 1
    fi
    if ((10#${ver1[i]} < 10#${ver2[i]})); then
        return 2
    fi

编辑:添加更多上下文

我在 Mac OS X 10.7.5 (Lion) 上使用 GNU bash,版本 3.2.48(1)-release (x86_64-apple-darwin11)。我这样调用 vercomp:

if [[ $OS = 'Mac' ]]; then                                                                                                                                                                                 
    ### EMACS VERSION CHECK                                                                                                                                                                                
    # make sure that we're working with emacs >= 24                                                                                                                                                        
    wanted_ver=24                                                                                                                                                                                          
    curr_ver=`emacs --version | grep -oE '[[:digit:]]+\.[.[:digit:]]*'`                                                                                                                                    
    echo $curr_ver                                                                                                                                                                                         
    vercomp $curr_ver $wanted_ver

请注意,我正在调用 grep 来初始化 curr_ver。我仍然无法弄清楚为什么会发生错误,但是使用 grep -EI --colour 不会产生错误,所以这回答了我问题的第二部分。有谁知道为什么会发生错误?


vercomp () {
    ## returns: 0 equal
    ##          1 ver1 > ver 2
    ##          2 ver1 < ver 2
    if [[ $1 == $2 ]]; then
        return 0
    fi

    # IFS (Internal Field Separator) Fields are separated by a '.'
    # ($var) notation means turn $var into an array according to the IFS.
    local IFS=.
    local i ver1=($1) ver2=($2)

    # fill empty fields in ver1 with zeros
    # ${#var[@]} = the number of elements in the array/var.
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
        ver1[i]=0
    done
    for ((i=0; i<${#ver1[@]}; i++)); do
        if [[ -z ${ver2[i]} ]]; then
            # fill empty fields in ver2 with zeros
            ver2[i]=0
        fi
        # <num>#$var converts the value of $var to the base of <num>
        if ((10#${ver1[i]} > 10#${ver2[i]})); then
            return 1
        fi
        if ((10#${ver1[i]} < 10#${ver2[i]})); then
            return 2
        fi
    done
    return 0
}

最佳答案

使用别名 grep 生成您传递给 vercomp 的两个变量中的任何一个,您几乎肯定会发现输出中有转义序列制作。

那是因为根据 grep手册页:

--color[=WHEN]: Surround the matched (non-empty) strings, matching lines, context lines, file names, line numbers, byte offsets, and separators (for fields and groups of context lines) with escape sequences to display them in color on the terminal.

如果您放置如下代码,这应该会变得很明显:

echo "$1" | od -xcb
echo "$2" | od -xcb

vercomp 函数的开头。在这种情况下,转义序列应该很容易被检测到。

事实上,如果我在包含您的 vercomp 函数的脚本中执行以下代码:

curr_ver=$(echo 21.7 | grep -EI --color=always '^..')
echo "$curr_ver" | od -xcb
vercomp $curr_ver 21.5

输出是:

0000000    5b1b    3130    333b    6d31    5b1b    324b    1b31    6d5b
        033   [   0   1   ;   3   1   m 033   [   K   2   1 033   [   m
        033 133 060 061 073 063 061 155 033 133 113 062 061 033 133 155
0000020    5b1b    2e4b    0a37
        033   [   K   .   7  \n
        033 133 113 056 067 012
0000026
./qq.bash: line 30: 10#21 > 10#21: syntax error: invalid arithmetic
    operator (error token is "21 > 10#21")
./qq.bash: line 33: 10#21 < 10#21: syntax error: invalid arithmetic
    operator (error token is "21 < 10#21")

所以你可以看到:

  • 输出中有转义序列,可以为您找到的术语着色;和
  • 它会生成与您看到的类似的错误。

如果你摆脱了着色(即使只是暂时的),你应该会发现错误消失了。

关于bash - 为什么 "24 > 10#24"会生成错误 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23262528/

相关文章:

linux - 为什么 find 的 -exec 选项包含 'non-matched' 项?

python - 了解如何使用 Bash 和/或 Biopython 管理表格数据(BLAST+6 格式)的资源

Linux 命令模糊重定向

linux - 使用 grep 从另一个 linux 脚本检测 linux bash 脚本中的注释行

linux - 如何在 ubuntu 14 中安装特定版本的软件包?

sed - .bash_profile sed :\1 not defined in the RE

regex - 如何使用 bash 和正则表达式排除单词列表中的单词?

bash - 在不打印作业和进程 ID 的情况下在后台运行 bash 命令

bash - 如何从 shell 下载所有 google 文档

linux - 如何导出计算节点的路径,并行编程