常规 shell /bin/sh(不是 bash)是否支持按位运算符
Are bitwise operators supported in regular shell /bin/sh (not 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 中使用按位运算符吗?
我认为问题在于您使用的是算术扩展返回的字符串,而不是退出代码。你可能应该在外面做等于 0
的测试,比如
if [ "$((y & 0x40))" -ne 0 ]; then
否则$(((y & 0x40) != 0))
返回一个字符串,它总是非空的,所以真值测试总是通过。
您可以使用除法和模运算来检查特定位:
if [ `expr \( $y / 64 \) % 2` -eq 1 ]; then
echo bit 6 is set
fi
根据 Alnitak 的回答,我会这样做:
if expr \( $y / 128 \) % 2 > /dev/null; then
echo bit 7 is set
fi
只是简洁了一点。
注意:2^7=128
我在 /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 中使用按位运算符吗?
我认为问题在于您使用的是算术扩展返回的字符串,而不是退出代码。你可能应该在外面做等于 0
的测试,比如
if [ "$((y & 0x40))" -ne 0 ]; then
否则$(((y & 0x40) != 0))
返回一个字符串,它总是非空的,所以真值测试总是通过。
您可以使用除法和模运算来检查特定位:
if [ `expr \( $y / 64 \) % 2` -eq 1 ]; then
echo bit 6 is set
fi
根据 Alnitak 的回答,我会这样做:
if expr \( $y / 128 \) % 2 > /dev/null; then
echo bit 7 is set
fi
只是简洁了一点。
注意:2^7=128