首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查bash中是否设置了第n位

检查bash中是否设置了第n位
EN

Stack Overflow用户
提问于 2015-07-02 16:35:17
回答 4查看 6.5K关注 0票数 5

我想知道是否有一种方法可以用来检查$2是否将第7位设置为1来替换if语句?

代码语言:javascript
运行
复制
cat $file | awk '{if ($2 == 87) print $1; else {}}' > out.txt"

例如,93应该打印一些东西,而128不应该。

EN

回答 4

Stack Overflow用户

发布于 2015-07-02 16:40:16

bash具有按位运算符

测试第7位:

代码语言:javascript
运行
复制
$ echo $(((93 & 0x40) != 0))
1

$ echo $(((128 & 0x40) != 0))
0

另请参阅bash documentation

但是,如果要解析文件中的值,最好继续使用awk,作为@RakholiyaJenish的答案

票数 9
EN

Stack Overflow用户

发布于 2015-07-02 16:38:01

您可以使用逐位运算来检查gawk中的第7位是否为1

代码语言:javascript
运行
复制
and($2,0x40)

注意:标准awk不支持按位操作。因此,您可以使用bash位操作或perl位操作(用于字符串处理)。

使用gawk

代码语言:javascript
运行
复制
gawk '(and($2,0x40)){print $1}' filename

使用perl

代码语言:javascript
运行
复制
perl -ane 'print "$F[0]\n" if ($F[1]&0x40)' filename
票数 3
EN

Stack Overflow用户

发布于 2017-01-24 14:12:25

您可以使用bash包装函数检查位集,在脚本或.bashrc中定义一个本地IFS运算符

代码语言:javascript
运行
复制
# Returns the bit positions set in the number for the given bit mask
# Use the return value of the function directly in a script

bitWiseAnd() {
    local IFS='&'
    printf "%s\n" "$(( $* ))"
}

并在如下所示的脚本函数中使用它

代码语言:javascript
运行
复制
# The arguments to this function should be used as number and bit-mask, i.e.
# bitWiseAnd <number> <bit-mask>
if [ $(bitWiseAnd "93" "0x40") -ne 0 ]
then
    # other script actions go here
    echo "Bit set"
fi

其思想是使用Input-Field-Separator(IFS),这是bash中的一个特殊变量,用于在展开后拆分单词,并将行拆分为单词。该函数在本地更改该值,以使用分词字符作为逐位AND运算符&

请记住,IFS是在本地更改的,不会对函数作用域之外的默认IFS行为产生影响。摘录自man bash页面,

外壳程序将IFS的每个字符视为分隔符,并将其他扩展的结果拆分成这些字符上的单词。如果IFS是未设置的,或者它的值恰好是默认值,那么、和在前面的扩展结果的开头和结尾的序列将被忽略,任何不在开头或结尾的IFS字符序列用于分隔单词。

"$(( $* ))"表示要由&拆分的参数列表,然后使用printf函数输出计算值。该函数还可以扩展为添加其他算术运算的作用域。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31179484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档