Это не будет работать, потому что он будет поврежден файл несколькими способами. Во-первых, переменные не подходят для двоичных данных, особенно все, что содержит символы null (нулевой байт). Во-вторых, используя ссылочную переменную без двойных кавычек, он значение слова расщепление и подстановочных. Наконец, " Эхо " добавляет новую строку в конце, что это печать. Вы можете решить последние две проблемы с помощью `функции printf "%s" на "$PDF-файл"` вместо `эхо $в формате PDF`, но первое сложнее решить. Вы должны что-то делать, как хранить его в кодировке base64. @Маттео я знаю о Java трассировку стека , если ты на этом настаиваешь я могу изменить его обратно. @Тим, пожалуйста, см. Мой ответ . Спасибо, @TimoSchwarzer! Так просто и эффективно @DavidRicherby хороший момент... @Dimitrimx это Unicode код (в десятичной системе). Они одинаковы для каждого шрифта. Я проверил тех, кто уже и не мог найти никаких соответствий

Давайте посмотрим на пример, с тщательно продуманной ввода текста:

текст=' Привет мир\
Foo бар\'

Это две линии, первая начиная с космоса и заканчивая обратной косой черты. Во-первых, давайте посмотрим, что происходит, без всяких мер предосторожности вокруг читать (но с использованием функции printf '%з\п' "$текст" внимательно печатать $текст без какого-либо риска расширения). (Ниже $ это в командной строке.)

$ е '%з\п' "$текст" |
 в то время как читать линии; делать функции printf '%з\п' "[$строка]"; сделано
[привет worldfoobar]

читайте съел обратные слеши: обратный слеш-новая строка вызывает символ новой строки, игнорируется, и обратная косая черта-ничего не учитывает, что первый слеш. Чтобы избежать обратной косой черты лечат специально, мы используем читал -Р.

$ е '%з\п' "$текст" |
 пока читала-Р линии; делать функции printf '%з\п' "[$строка]"; сделано
[Привет мир\]
[Foo бар\]

Это лучше, у нас есть две линии, как ожидалось. Две линии почти содержат необходимый контент: двойной пробел между "привет" и мир был сохранен, потому что это в строке переменной. С другой стороны, начальное пространство было съедено. Это потому, что читать читает, как много слов, как вы передаете его переменных, за исключением того, что последняя переменная содержится на остальной части линии — но она по-прежнему начинается с первого слова, т. е. пробелы отбрасываются.

Итак, для того, чтобы прочитать каждую строчку буквально, мы должны убедиться, что нет слова расщепление происходит. Мы делаем это путем установки ИФС переменной пустое значение.

$ е '%з\п' "$текст" |
 в то время как ИФ= читайте -Р линии; делать функции printf '%з\п' "[$строка]"; сделано
[ Привет мир\]
[Foo бар\]

Обратите внимание, как мы установили МФС специально для продолжительности чтения встроенный. В ИФС= читайте -Р строка задает переменную среды ИФС (пустое значение), специально для выполнения чтения. Это пример общей команды синтаксис: (возможно, пустая) последовательность присвоения переменных, затем имя команды и ее аргументы (кроме того, вы можете бросить в перенаправлений в любой момент). Поскольку чтение -это встроенная переменная фактически никогда не попадает на внешний процесс по окружающей среде; тем не менее значение $МФС - это то, что мы присваиваем там, пока читал это executing1. Обратите внимание, что чтение не является специальным встроенным, так что задание длится только на его продолжительность.

Таким образом, мы заботимся не изменить значение ИФС для других инструкций, которые могут положиться на него. Этот код будет работать независимо от того, что окружающие код поставил МФС изначально, и это не вызовет никаких проблем, если код внутри цикла опирается на МФС.

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

ИФС=":"; комплект -Ф
в то время как ИФ= читать -R имя; делать
 для dir в $Path; делать
 ## На данный момент, "опять" еще ":"
 если [ -Е "каталог$dir/$имя" ]; затем Эхо "каталог$dir/$имя"; интернет
сделано
сделано <filenames.txt

Если цикл был при МФС=; читать -R имя; делать ..., то для dir в $Path не разделить $путь в двоеточие компонентов. Если код был ИФС=; во время чтения ..., было бы еще более очевидно, что МФС не установлен : в петле тела.

Конечно, можно было бы восстановить значение ИФС после выполнения чтения. Но это потребует зная предыдущие значения, что дополнительные усилия. ИФС= читать простой способ (и, удобно, а также самый короткий путь).

1 и, если чтение прерывается сигнал ловушке, возможно, пока ловушка выполнения — это не указано в стандарте POSIX и зависит от оболочки на практике.