gpt4 book ai didi

bash - 为什么 [[ -eq ]] 在 Bash 中将非数字字符串显示为相等?

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

我知道we should use = (或其别名 ==)在 Bash 中比较字符串。但是我忘记了它并在脚本中使用了 -eq,得到了奇怪的结果,但没有错误。

我还没有找到与此相关的任何文档,但根据我的测试,[[ "$foo"-eq "$bar"]] 似乎总是评估为0,即成功,对于 $foo$bar任何值,前提是它们不是以一个数字:

$ [[ "1" -eq "1" ]] && echo yes || echo nope
yes
$ [[ "1" -eq "0" ]] && echo yes || echo nope
nope
$ [[ "x1" -eq "0" ]] && echo yes || echo nope
yes
$ [[ "x1" -eq "x0" ]] && echo yes || echo nope
yes
$ [[ foo -eq bar ]] && echo yes || echo nope
yes
$ [[ so -eq different ]] && echo yes || echo nope
yes

当一个值以数字开头时,它的计算结果确实为 1(错误):

$ [[ 1x -eq 1 ]] && echo yes || echo nope
bash: [[: 1x : valeur trop grande pour la base (le symbole erroné est "1x")
nope

我收到的错误消息是法语的“value too high for the base(错误的符号是“1x””)。

为什么它不返回 1 和/或在获取非数字时显示错误?当您犯了那个错误时,调试起来真的很困难。

我使用的是 GNU bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu)。

最佳答案

在算术上下文中,bash 会首先尝试查看它是否是一个数字,然后再查看它是否是一个有效的 var 名称。如果它是一个 var 名称,但 var 为空或未定义,则该值将为 0。

[STEP 100] # echo $BASH_VERSION
4.4.12(1)-release
[STEP 101] # n=123
[STEP 102] # [[ n -eq 123 ]] && echo yes || echo no
yes
[STEP 103] # [[ 'n' -eq 123 ]] && echo yes || echo no
yes
[STEP 104] # varname=n
[STEP 105] # [[ $varname -eq 123 ]] && echo yes || echo no
yes
[STEP 106] # [[ notdefined -eq 123 ]] && echo yes || echo no
no
[STEP 107] # [[ notdefined -eq 0 ]] && echo yes || echo no
yes
[STEP 108] #

即使这样也行得通:

[STEP 108] # expr='100 + 20 + 3'
[STEP 109] # [[ expr -eq 123 ]] && echo yes || echo no
yes
[STEP 110] #

并且展开是递归的:

[STEP 201] # a=b
[STEP 202] # b=c
[STEP 203] # c=123
[STEP 204] # [[ a -eq 123 ]] && echo yes || echo no
yes
[STEP 205] # (( a == 123 )) && echo yes || echo no
yes
[STEP 206] #

来自 bash 的手册页:

ARITHMETIC EVALUATION

Shell variables are allowed as operands; parameter expansion is performed before the expression is evaluated. Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax. A shell variable that is null or unset evaluates to 0 when referenced by name without using the parameter expansion syntax. The value of a variable is evaluated as an arithmetic expression when it is referenced, or when a variable which has been given the integer attribute using declare -i is assigned a value. A null value evaluates to 0. A shell variable need not have its integer attribute turned on to be used in an expression.

关于bash - 为什么 [[ -eq ]] 在 Bash 中将非数字字符串显示为相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47475445/

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