Linux 查找2的幂的Shell脚本

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**

我需要一个脚本,将读取用户输入,检查参数是否是数字,然后检查哪些是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**&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