Первая проблема у вершины
while read -d "" -n 1 ; do astring+=( "$reply" ) ; done <<< "$string"
$reply
неверно, поскольку вы не указали имя переменной для чтения: $REPLY
.
Следующая ошибка в конце
c=$c ^ 0xffff
Это должно быть
c=$(($c ^ 0xffff))
По крайней мере, так будет работать без ошибок, правильность и уместность - это нечто другое.
Проблемы с корректностью: что делать, если во входной строке есть пробел? Это ужасно сломается. Всегда заключайте в кавычки переменные
Изменение
char=${astring[$x]}
до
char="${astring[$x]}"
Странно, но это правило отличается внутри $(())
конструкций. Ваши битовые операции должны ссылаться на переменные без $
, в этих случаях
e=$(( c ^ char ))
s=$(( e << 4 ))
f=$(( e ^ s ))
t1=$(( c >> 8 ))
t2=$(( f << 8 ))
t3=$(( f << 3 ))
t4=$(( f >> 4 ))
r1=$(( t1 ^ t2 ^ t3 ^ t4))
и позже
c=$(( c ^ 0xffff ))
Это приведет к тому, что переменные будут расширены и пробелы не будут взрываться.
Как правило, вы также должны передать -r
в read
, см. help read
о том, что он делает.
Зачем делать дополнительную копию $1
перед обработкой в массив? Использование
while read -d "" -n 1 ; do astring+=( "$REPLY" ) ; done <<< "$1"
достаточно.
Вероятно, нет необходимости превращать ваши входные данные в массив перед обработкой. Вместо этого вы можете вырезать символы из строки в вашем цикле, что ближе к тому, что делает версия C ++. Заменить
char="${astring[$x]}"
с
char="${1:$x:1}"
Это работает непосредственно с параметром функции; так как мы больше не делаем копию этого, нам также нужно получить $cnt
другим способом
cnt=${#1}
Но у вас действительно есть еще большие проблемы, такие как тот факт, что персонаж не является целым числом в bash. Для конвертации вы должны использовать следующий синтаксис:
printf '%d' \'a
, где a
- символ для преобразования. Если вставить это в контекст скрипта, это будет
char=$(printf '%d' \'"${1:$x:1}")
Сейчас мы куда-то добираемся, но я действительно должен попросить вас подумать, действительно ли все это того стоит. Даже если ты сможешь заставить это работать, что ты получишь?