我有这行:
if [ $((M & ;0x10000000)) -eq 0 ]; then
但是我不知道这行是什么意思。 M
是包含数字的变量。但是我不知道& ; 0x10000000
会用数字做什么。
答案 0 :(得分:1)
让我们逐步分析您的行,并在man bash
中查看答案:
$(( expression ))
:
算术扩展允许对算术表达式进行求值并替换结果。算术扩展的格式为
$((expression))
。将该表达式视为在双引号内,但括号内的双引号未得到特殊处理。表达式中的所有标记都经过参数扩展,字符串扩展,命令替换和引用删除。算术扩展可以嵌套。根据以下“算术评估”下列出的规则进行评估。如果expression
无效,则bash会显示一条消息,指示失败,并且不会发生替换。
这告诉我们M & 0x10000000
将被算术评估。
M & 0x10000000
:
在某些情况下,shell允许对算术表达式求值(请参见
let
并声明内置命令和Arithmetic Expansion
)。评估是使用固定宽度的整数完成的,不检查溢出,尽管陷阱会被除以0并标记为错误。运算符及其优先级,关联性和值与C语言中的相同。以下运算符列表被分组为等优先级运算符。级别按降序排列。
&
按位与
这告诉我们,变量M
将以十六进制值0x10000000
进行bitwise AND
运算。后者是268435456或2 ^ 28的十六进制表示形式。因此,从本质上讲,如果M & 0x10000000
的第29位设置为0x10000000
,则操作M
将返回1
,否则将返回0x0
(请注意,它是一个比2 ^ 0 = 1多一点)。
[ EXPRESSION ]
:执行二进制文件/bin/test
并以EXPRESSION确定的状态退出。
INTEGER1 -eq INTEGER2
INTEGER1
等于INTEGER2
这告诉我们,如果[ $((M & 0x10000000)) -eq 0 ]
的结果等于0,则表达式true
将返回M & 0x10000000
,否则将返回false。
简而言之,
if [ $((M & 0x10000000)) -eq 0 ]; then
将对M
进行测试,以检查M
的第28位是否已设置。如果未设置,它将执行if
语句中定义的操作。
本来应该是另一种表示法
if (( M & 0x10000000 == 0x0 )); then
答案 1 :(得分:0)
正在检查M
中数字的第29位是否清除。
$ M=0xEFFFFFFF; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
CLEAR
$ M=0xFFFFFFFF; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
SET
$ M=0x10000000; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
SET
$ M=0; [ $((M & 0x10000000)) -eq 0 ] && echo CLEAR || echo SET
CLEAR
&
是按位和运算符,它返回带有位集的数字,其中操作数具有相同的位集。参见https://en.wikipedia.org/wiki/Bitwise_operation
答案 2 :(得分:0)
https://www.tldp.org/LDP/abs/html/dblparens.html
$((expression))
将进行算术扩展。
第if [ $((M & 0x10000000)) -eq 0 ]; then
行将检查$M
变量的第29位是否为零。如果是这种情况,它将执行then
语句之后的内容。