Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 奇怪的比较结果_Bash_Shell - Fatal编程技术网

Bash 奇怪的比较结果

Bash 奇怪的比较结果,bash,shell,Bash,Shell,我有一些bash问题: 预计: [[ 0 -eq 0 ]] && echo "equal!" > equal! 这不是: [[ "" -eq 0 ]] && echo "equal!" > equal! 为什么等于0 如何检查数值相等性?这是因为Bash试图将您在-eq两侧输入的内容转换为整数,并将空字符串转换为零。转换绝不是微不足道的。下面是我希望代码在没有实际阅读的情况下解析数字的方式: $ [[ x -eq 0 ]] && e

我有一些bash问题:

预计:

[[ 0 -eq 0 ]] && echo "equal!"
> equal!
这不是:

[[ "" -eq 0 ]] && echo "equal!"
> equal!
为什么等于0


如何检查数值相等性?

这是因为Bash试图将您在-eq两侧输入的内容转换为整数,并将空字符串转换为零。转换绝不是微不足道的。下面是我希望代码在没有实际阅读的情况下解析数字的方式:

$ [[ x -eq 0 ]] && echo "equal!"
equal!
在Bash检测到一个数字上下文-eq之后,它开始在左侧从零开始创建一个数字,扫描并找到x,丢弃它,扫描并找到空白,因此认为左侧为零。因此,上述等式相当于[[0-等式0]]

再次从零开始,Bash在x之前看到一个零并进入备用基模式,找到一个x并进入十六进制模式,然后将剩余的数字10作为十六进制数读取

$ [[ 00x10 -eq 16 ]] && echo "equal!"
bash: [[: 00x10: value too great for base (error token is "00x10")
在进入备用基本模式后,Bash在看到一个零后看到一个数字,即第二个零,因此进入八进制模式。在这种模式下,x被视为数字字符,因为它可以用于更高的基数,但x不是有效的八进制数字,因此失败


有关详细信息,请参阅。

这可能会有所帮助:如果您只是检查是否相等,并且不确定变量是否为数字,那么我建议您改用字符串比较,例如。[[==0]]。如果您想要数值相等,则可以使用[-eq 0]或==0,但它们将在stderr上显示一条错误消息,告诉您它们需要一个整数或缺少一个操作数可能是空字符串get转换为0的重复项。Ie.[-eq 1]]为假;那回声是什么?;fi给出以下输出:什么?一旦你知道了原因,你就会发现BASH脚本编写其实很简单。Re:BASH从左边的零开始,扫描并找到x,丢弃它,扫描并找到空白,然后考虑左边的零:如果你的意思是说[[x-eq 0]]相当于[[-eq 0]],那么-不,那不是真的。相反,[[x-eq 0]]相当于[[$x-eq 0]],因此大致相当于[[$x-eq 0]]:它将x解释为一个算术表达式,这涉及到将参数x和其值解释为一个算术表达式。我是向下投票人。我投了反对票,因为我在之前的评论中指出了这一点。我没有立即投反对票,因为我等着看你是否会以有意义的方式或者以承认错误的方式回答。相反,你的回答方式是对一个没有意义的解释加倍的,并且在x=1的情况下显然是错误的;[[x-等式1]]&&echo equal!。既然你不想解决这个问题,我决定最好干脆投否决票,以提醒粗心的读者。
$ [[ 00x10 -eq 16 ]] && echo "equal!"
bash: [[: 00x10: value too great for base (error token is "00x10")