Переменные bash (и переменные окружения, и аргументы unix, и ...) не являются бинарно-безопасными.Самая большая проблема заключается в том, что они не могут содержать нулевые байты (то есть символ ASCII NUL), так как это терминатор строки.В некоторых ситуациях также возникают проблемы с удалением / добавлением символов новой строки, а в некоторых версиях echo
символы обратной косой черты рассматриваются как экранированные символы, которые необходимо интерпретировать.По сути, ответ таков: не пытайтесь хранить двоичные данные в оболочке.
Но вы можете преобразовать данные в недвоичный формат (hex, base64, uuencode и т. Д.) И сохранить, передатьи т. д. данные в этой форме.Просто не забудьте конвертировать форматы, где это уместно.Вот пример использования base64:
$ curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt > out.1
$ a=$(curl -s http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt | base64)
$ echo "$a" | base64 -d >out.2
$ diff -s out.*
Files out.1 and out.2 are identical
Кстати, я рекомендую использовать имена переменных в нижнем или смешанном регистре (есть куча переменных с заглавными буквами со специальным значением, и один из них используется случайно)может иметь странные эффекты), а также использовать $( )
вместо кавычек (легче для чтения и позволяет избежать некоторых неясных синтаксических странностей).