如何在BASH中将两个字符作为小数进行XOR

are*_*naq 0 unix bash shell char xor

我需要对两个字符执行XOR。我得到了这个功能,但是它不会打印出我期望的:

#!/bin/sh

xor() {
    key=$1
    length=${#key}
    while read -r -N1 byte
    do
        char=${key:$((i % length)):1}
        echo $((byte ^ char))
    done
}

echo "5555" | xor "4567"
Run Code Online (Sandbox Code Playgroud)

输出:

1
1
1
1
4
Run Code Online (Sandbox Code Playgroud)

我希望带有掩码4567的输入5555能够看到输出:

1
0
3
2
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑:所以我改变了我的功能:

xor() {
    key=$1
    length=${#key}
    i=0
    while read -r -N1 byte
    do
        char=${key:$((i % length)):1}
        ((i++))
        echo $((byte ^ char))
    done
}
Run Code Online (Sandbox Code Playgroud)

尝试致电时仍然出现错误:

cat $2 | xor $1
Run Code Online (Sandbox Code Playgroud)

// $ 1是键,$ 2是文件名

作为文件,我使用标准文本文件,并使用字符串作为键。它说在行echo $((byte ^ char))< 上有错误:语法错误:期望操作数(错误的标记是“ <”)

P.P*_*.P. 5

您不会移至中的下一个字符key((i++))在循环末尾添加:

xor() {
    key=$1
    length=${#key}
    while read -r -N1 byte
    do
        char=${key:$((i % length)):1}
        ((i++))
        echo $((byte ^ char))
    done
}

echo -n "5555" | xor "4567"
Run Code Online (Sandbox Code Playgroud)

echo会发送您可能不需要的换行符。因此,请跳过-n。我认为,通过两个论点会更清洁。

我也建议不要使用/bin/shshebang,因为该脚本实际上是bash/bin/sh可能链接到不同系统上的不同外壳。它并不总是安全的。始终使用适当的shebang