我正在尝试在Shellscript(Bash)中创建一个简单的程序来计算2的补码二进制数。
作为测试,我只使用8位二进制值(00000100),但我一直在接受#34; Bad Substitution"错误,我不明白为什么。
#!/bin/bash
binary=00000100
firstBit=${binary:0:1}
secondBit=${binary:1:1}
thirdBit=${binary:2:1}
fourthBit=${binary:3:1}
fifthBit=${binary:4:1}
sixthBit=${binary:5:1}
seventhBit=${binary:6:1}
eighthBit=${binary:7:1}
binaryNew=""
if [[ $firstBit == "1" ]]
then
binaryNew=0
if [[ $secondBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $thirdBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $fourthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $fifthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $sixthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $seventhBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
if [[ $eighthBit == "1" ]]
then
binaryNew+=0
else
binaryNew+=1
fi
fi
fi
fi
fi
fi
fi
fi
echo $binaryNew=
任何帮助都将不胜感激。
由于
答案 0 :(得分:4)
要对8位二进制值进行二进制补码:
$ binary=00000100
$ x=$((2#$binary))
$ [ "$x" -gt 127 ] && ((x=x-256)); echo "$x"
4
表达式$((2#$binary))
执行从二进制到十进制的转换。
命令[ "$x" -gt 127 ] && ((x=x-256))
在8位值上执行两个补码。
答案 1 :(得分:2)
如果要迭代某个值,请使用循环而不是为每个位置定义变量:
#! /bin/bash
binary=0100
for ((pos=0 ; pos < ${#binary} ; pos++ )) ; do
if (( ${binary:$pos:1} )) ; then
complement+=0
else
complement+=1
fi
done
echo $complement
答案 2 :(得分:2)
我将不回答如何在bash中计算2的补码。 相反,我会回答为什么OP获得“不良替代”的原因。错误。
请注意shebang之前的两个空格:
#!/bin/bash
由于这些原因,它并没有被解释为一个shebang,而是一个通常用两个空格缩进的注释行。
因此,脚本不是由bash执行的,而是由用户的默认shell执行的,在OP的情况下,它很可能是/bin/sh
或者符号链接到的任何内容
您可以确定用户使用的shell默认为建议的here:
getent passwd $LOGNAME | cut -d: -f7
答案 3 :(得分:1)
对于bash中的算术运算使用双括号((
.. ))
,否则如果变量声明为整数,则可以执行某些操作。
typeset -i binaryNew
binaryNew+=1
或
((binaryNew+=1))
bash算术只能从2到62之间的基数转换为基数10,例如
i=$((2#10101))
echo "$i"
答案 4 :(得分:1)
使用bash,tr和bc:
#!/bin/bash
binary=00000100
# Ones' complement, result decimal
c1=$(tr 01 10 <<< $binary)
# Two's complement, result decimal
c2=$((2#$c1+1))
# convert decimal to binary
echo "obase=2; $c2" | bc
输出:
11111100