Я пытаюсь зашифровать текст, так что у меня этот файл шифрует a-z и A-z для разных наборов алфавита.
#!/bin/bashcode
encrypted=$1
message=$2
cat $message | tr "[a-z][A-Z]" "encrypted"
но это дает мне странный набор. Что я делаю неправильно?
Кстати, обратите внимание, что значение [a-z][A-Z] очень зависит от локали, и если ваш код запускается в локали, где порядок сортировки похож на AaBbCc...Zz, а не на ABC...Zabc...z или abc...zABC...Z, вы получите удивительные результаты.
(Или вы хотите, чтобы "$encrypted" фактически использовал переменную, которую вы назначили в предыдущей строке? Или "$(<"$encrypted")", чтобы прочитать файл, указанный в этой переменной, и заменить его содержимое? не знаю, что вы хотеть этот код делать).
Я почти уверен, что вы ищете < "$message" tr "[a-z][A-Z]" "$(cat "$encrypted")"
Но «зашифрованный» кажется неправильным названием для вашего шифра.
@WilliamPursell Большинство tr не требует [] для диапазонов - особенно GNU tr (gnu.org/software/coreutils/manual/html_node/…).
@CharlesDuffy, что вы имеете в виду под термином «зависящий от локали»? Я хочу использовать зашифрованную переменную вместо того, чтобы жестко кодировать то, что зашифровано
@WilliamPursell Я пробовал это, но это дало мне ошибку, поэтому я просто двинулся дальше ... может я что-то напечатал не так
@lolads, то, что я имею в виду под "зависящим от локали", заключается в том, что значение зависит от языковых настроек вашей системы. В разных частях света действуют разные правила сортировки букв перед другими, и такие выражения, как A-Z, подчиняются этим правилам. Если вы хотите, чтобы ваш код вел себя единообразно везде, вы пишете все буквы в том порядке, в котором они вам нужны.
@CharlesDuffy а, это правда, но когда я погуглил о tr, мне показалось, что [a-z] [A-Z] довольно распространены. Разве это не значит, что все буквы от a до z и заглавные буквы от A до Z?
Он широко используется в большинстве англоязычных стран, но все же есть места, где он ломается. Такое широко распространенное использование антипаттернов - пример того, почему доверять Google иногда неразумно.
Экспорт LC_COLLATE=C поможет смягчить последствия, указав конкретный известный порядок сортировки.
Позвольте нам продолжить обсуждение в чате.





У вас должно быть однозначное соответствие символов в tr:
cat $message | tr "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "qwertyuioplkjhgfdsazxcvbnmMNBVCXZASDFGHJKLPOIUYTREWQ"
да, это то, что я сделал, но я не думаю, что это самый эффективный способ
<"$message" будет менее глючным, чем cat $message. Даже cat "$message" был бы улучшением.
@CharlesDuffy Я использую cat, потому что хочу увидеть результат на своем терминале. не <перенаправляет вывод в файл?
@CharlesDuffy Я чувствую, что кодирую жестко?
@lolads, <"$message" ... настраивает stdin для ..., чтобы он поступал прямо из файла, тогда как cat "$message" | ... настраивает stdin для ..., чтобы он поступал из копии cat, которая читает из файла, поэтому у вас есть программа (cat), сидящая между файлом и экземпляр tr. Такой вид косвенного обращения означает, что программа (... в нашем примере выше) не имеет прямого доступа к файлу - она не может спросить, сколько времени это длится, не прочитав до конца, чтобы попытаться увидеть, например , потому что только cat имеет дескриптор самого файла.
это не безопасное шифрование, а просто для развлечения
$ function rot13() { tr 'A-Za-z' 'N-ZA-Mn-za-m'; }
$ echo "Et tu, Brute?" | rot13
Rg gh, Oehgr?
$ echo "Et tu, Brute?" | rot13 | rot13
Et tu, Brute?
13, очевидно, составляет половину длины алфавита, поэтому и шифрование, и дешифрование используют одно и то же преобразование; один из видов шифра Цезаря.
минимальный воспроизводимый пример принесет здесь много пользы. «Вот как я вызываю сценарий, это результат, который я получаю, и это результат, который я ожидаю» было бы легче проверить, чем просто обсудить, является ли что-то «странным». (Если ваш вывод содержит только символы из слова
encrypted... ну, это именно то, что можно было бы ожидать от этого кода).