我在使用/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中使用按位运算符?
sh
不支持位移操作。 - Inian/bin/sh
可以是 POSIX sh(早期 1990 年代标准)或 Bourne shell(1970 年代实现)。特别是在 Solaris 上,这两者在现代时代都存在(如果后者在/bin
中,则前者通常在/usr/xpg/bin
中);$(( ))
仅存在于前者中。你知道你使用的是哪个吗? - Charles Duffyexpr
支持&
,但它被 POSIX 定义为布尔逻辑运算符,而不是位运算符。即使以这种方式工作,您也需要对其进行转义:expr "$i" '&' 64
; 在您原始代码的未转义情况下,&
告诉 shell 将其左侧的所有内容放到自己的命令中在后台运行(然后尝试将右侧的内容解析为另一个单独的命令,因此它将0x40
作为命令运行,并将该命令的输出捕获到名为val
的变量中...因此导致了原始代码的失败)。 - Charles Duffy