Linux 查找2的幂的Shell脚本
我需要一个脚本,将读取用户输入,检查参数是否是数字,然后检查哪些是2的幂Linux 查找2的幂的Shell脚本,linux,bash,shell,Linux,Bash,Shell,我需要一个脚本,将读取用户输入,检查参数是否是数字,然后检查哪些是2的幂 #!/bin/bash n='^[0-9]+$' i=0 a=2 c=$((&a**&n)) for i in "$@"; do if [[ $i =~ $n ]]; then if [[ $i == $c ]]; then echo " $i is a power of 2 " fi fi ((i++)) done 但是我得到了这个错误:>a**
#!/bin/bash
n='^[0-9]+$'
i=0
a=2
c=$((&a**&n))
for i in "$@"; do
if [[ $i =~ $n ]]; then
if [[ $i == $c ]]; then
echo " $i is a power of 2 "
fi
fi
((i++))
done
但是我得到了这个错误:>a**&n:语法错误:预期的操作数(错误标记为“&n”)尝试这个脚本
#!/bin/bash
n='^[0-9]+$'
for i in "$@"; do
if [[ $i =~ $n ]]; then
if [[ $((i & (i-1))) == 0 ]]; then
echo " $i is a power of 2 "
fi
fi
done
我的版本
因为我不喜欢regex,我更喜欢:
isPow2() {
for i;do
[ "$i" ] && [ -z "${i//*([0-9])}" ] &&
! ((i&(i-1))) &&
printf " %11d is a power of 2\n" $i
done
}
解释:
***
注意:如果结果不为null(0),则在bash下,(…)
将变为true
。因为我想要匹配=0
,所以我必须否定测试<代码>!((…)
然后:
表演
我在主机上用{1..10000}
进行的第一次测试耗时177ms,已耗时435ms:
time isPow2 {1..10000} | wc -l
14
real 0m0.212s
user 0m0.198s
sys 0m0.023s
及
对于第一个概述,请将您的脚本粘贴到这里:我真希望人们能够分配与实际使用shell类似的shell编程任务。变量
c
的使用没有意义。它所设置的公式似乎是2,被提升为正则表达式的幂(这是毫无意义的),我不确定&
字符应该是什么。此外,当您使用它时,您将它作为字符串(或者可能是通配符模式)与数字进行比较,这也没有意义。顺便说一句,这与@RiderOfLightning有关吗?正如错误消息所说:&n
没有意义。没有名为&
的一元算术运算符。你想用它来表达什么?嗯,是的,&
应该是一个$
,这是一个愚蠢的错误。我对shell脚本非常熟悉,我不知道你不能将2提升到正则表达式的能力,谢谢你的指出。bash正则表达式非常昂贵!看一看,大约快2倍!
isPow2 {1..100}
1 is a power of 2
2 is a power of 2
4 is a power of 2
8 is a power of 2
16 is a power of 2
32 is a power of 2
64 is a power of 2
time isPow2 {1..10000} | wc -l
14
real 0m0.212s
user 0m0.198s
sys 0m0.023s
isPow2zlyoha() { n='^[0-9]+$';for i in "$@";do if [[ $i =~ $n ]];then
if [[ $((i & (i-1))) == 0 ]];then echo " $i is a power of 2 ";fi;fi;done;}
time isPow2zlyoha {1..10000} | wc -l
14
real 0m0.502s
user 0m0.484s
sys 0m0.020s