Мне нужно написать несколько сложных XML в переменную внутри скрипта bash. Xml должен быть читаемым внутри скрипта bash, так как именно здесь будет находиться фрагмент xml, он не читается из другого файла или источника.
Итак, мой вопрос заключается в следующем: если у меня есть длинная строка, которую я хочу, чтобы в моем скрипте bash читалось человеком, как лучше всего это сделать?
В идеале я хочу:
- не убегать ни от одного из персонажей
- сделать его разбитым на несколько строк, делая его читаемым человеком
- держать отступ
Можно ли это сделать с помощью EOF или еще чего-нибудь, кто-нибудь может дать мне пример?
например
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
Ответы:
Это поместит ваш текст в вашу переменную без необходимости экранировать кавычки. Он также будет обрабатывать несбалансированные кавычки (то есть апострофы
'
). Помещение кавычек вокруг часового (EOF) предотвращает расширение параметра в тексте. В-d''
причинах его прочитать несколько строк (игнорировать символ новой строки).read
является встроенным в Bash, поэтому не требует вызова внешней команды, такой какcat
.источник
cat
.cat
это внешняя команда. Не использовать это спасает делать это. Плюс, у некоторых есть философия, что если вы используете cat с менее чем двумя аргументами «Ура, вы делаете это неправильно» (что отличается от «бесполезного использованияcat
»).set -e
. Кажется,read
всегда возвращает ненулевое значение. Вы можете! read -d .......
String
переменную для записи в файл, поместите переменную вокруг «QUOTES», какecho "${String}" > /tmp/multiline_file.txt
илиecho "${String}" | tee /tmp/multiline_file.txt
. Мне потребовалось больше часа, чтобы найти это.Вы были почти там. Либо вы используете cat для сборки вашей строки, либо заключаете в кавычки всю строку (в этом случае вам нужно будет избегать кавычек внутри вашей строки):
источник
'EOF'
или"EOF"
, иначе переменные оболочки будут проанализированы.Это должно хорошо работать в среде оболочки Bourne
источник
Еще один способ сделать то же самое ...
Мне нравится использовать переменные и специальные,
<<-
которые сбрасывают табуляцию в начале каждой строки, чтобы разрешить отступ скрипта:предупреждение : раньше не было пустого места,
Некоторые объяснения:eof
а только табуляция ."${Pattern[*]}"
этот массив в строку.IFS=";"
потому что нет;
в обязательных строкахwhile IFS=";" read file ...
неIFS
позволяет изменять остальную часть сценария. В этом толькоread
используйте измененныйIFS
.источник
mapfile
требуется Bash 4 или выше. И синтаксис"${Pattern[*]}"
преобразует массив в строку в кавычках (как показано в примере кода).Во многих других ответах слишком много угловых случаев.
Чтобы быть абсолютно уверенным, что нет проблем с пробелами, табуляциями, IFS и т. Д., Лучше использовать конструкцию «heredoc», но закодировать содержимое heredoc,
uuencode
как описано здесь:https://stackoverflow.com/questions/6896025/#11379627 .
источник