Цезарь Сайфер Код не работает
Я имею в виду создание Цезаря Сайфера, который принимает параметр и сдвигает код на основе этого параметра, но мой код путается с верхним и нижним регистром.
Итак, это должно быть похоже на:
$ echo "I came, I saw, I conquered." | ./caesar.sh
V pnzr, V fnj, V pbadhrerq.
но я получаю:
V pnzr, V FnJ, V pBADHERrq.
Мой код:
#!/bin/sh
if [ -z "$@" ];then
rotation=13;
else
rotation=$((@ % 16));
fi
tr $(printf %${rotation}s | tr ' ' '.')\a-zA-Z a-zA-Z
Как я могу это исправить?
2 ответа
Вы вращаетесь по всему двойному алфавиту, 'a-zA-Z', поэтому 's' отображается на 'F':
abcdefghijklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ
|------------^
Вы, очевидно, хотите сохранить регистр, поэтому я бы порекомендовал вам применить два отдельных отображения: во-первых, сопоставить 'az' с 'n-za-m' (или любым другим, в зависимости от вашего входного параметра). Затем во втором проходе, карта столиц, 'AZ' -> 'N-ZA-M'.
Основная адаптация вашей схемы, которая работает:
rotation=$((${1:-13} % 26))
padding=$(printf "%${rotation}s" "" | tr ' ' '\001')
tr "${padding}a-z" "a-za-z" |
tr "${padding}A-Z" "A-ZA-Z"
Это использует расширение параметра и арифметику, чтобы определить вращение.
Он использует ваш основной механизм для установки отступов, но использует Control-A вместо .
как символ заполнения; у вас редко есть Control-A в вашем тексте.
Фактические команды вращения имеют дело с нижним регистром отдельно от верхнего регистра.
Сценарий, содержащийся в файле script.sh
, Я получил:
$ bash script.sh
I came, I saw, I conquered
Can you say SYZYGY after midnight?
V pnzr, V fnj, V pbadhrerq
Pna lbh fnl FLMLTL nsgre zvqavtug?
$ bash script.sh 3
I came, I saw, I conquered, and O, was it ever worthwhile!
Can you say SYZYGY after midnight? ABC...XYZ abc...xyz
L fdph, L vdz, L frqtxhuhg, dqg R, zdv lw hyhu zruwkzkloh!
Fdq brx vdb VBCBJB diwhu plgqljkw? DEF...ABC def...abc
$
Конвейер означал, что первая строка ввода не была перенесена на вторую tr
Команда в конце строки.