10#24"会生成错误 token ?-6ren"> 10#24"会生成错误 token ?-我有一个函数 vercomp 可以比较两个版本字符串并确定哪个版本更大。当我添加这个别名时: alias grep='grep -EI --colour=always' 对于我的 bashrc 文件看-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:21:45 25 4
gpt4 key购买 nike

我有一个函数 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com