Цезарь Сайфер Код не работает

Я имею в виду создание Цезаря Сайфера, который принимает параметр и сдвигает код на основе этого параметра, но мой код путается с верхним и нижним регистром.

Итак, это должно быть похоже на:

$ 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 Команда в конце строки.

Другие вопросы по тегам