常规shell / bin / sh(不是bash)支持按位运算符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常规shell / bin / sh(不是bash)支持按位运算符相关的知识,希望对你有一定的参考价值。

我在/ bin / sh中使用按位和运算符时遇到错误。我可以在bash中使用它,但是执行代码的脚本在常规shell中启动,因此我需要使它在普通的常规shell中工作。我需要简单地检查是否设置了某个位,例如第7位

以下代码在bash中工作,但不在/ bin / sh中

#!/bin/bash
y=93
if [ $((($y & 0x40) != 0)) ]; then
  echo bit 7 is set
fi

我通过删除算术扩展在/ bin / sh上面尝试过

#!/bin/sh
y=93
val=`expr $y & 0x40`
if [ $val != 0 ]; then
   echo worked 1
fi

有人可以建议在普通的常规shell中如何使用按位运算符吗?

答案

您可以使用除法和模运算来检查特定位:

if [ `expr ( $y / 64 ) % 2` -eq 1 ]; then
  echo bit 6 is set
fi
另一答案

我认为问题是你正在使用算术扩展返回的字符串,而不是退出代码。你可能应该在外面测试等于0的测试

if [ "$((y & 0x40))" -ne 0 ]; then

否则$(((y & 0x40) != 0))返回一个字符串,它将永远是非空的,所以真值测试将永远通过。

另一答案

根据Alnitak的回答,我会这样做:

if expr ( $y / 128 ) % 2 > /dev/null; then
  echo bit 7 is set
fi

它只是更简洁一点。

请注意:2 ^ 7 = 128

以上是关于常规shell / bin / sh(不是bash)支持按位运算符的主要内容,如果未能解决你的问题,请参考以下文章

[shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

怎么把shell的/bin/bash改为/bin/sh

Ubuntu下把缺省的dash shell修改为bash shell

linux的shell编程中#!/bin/sh和bash是啥意思?

shell脚本首行#!/bin/sh和#!/bin/bash的含义与区别

执行shell脚本报-bash: ./test.sh: /bin/bash^M: 坏的解释器