Как вставить переменные внутри строки, содержащей «»?

У вас есть две смонтированные файловые системы с одинаковыми характеристиками: одинаковое имя устройства, одинаковое использование диска. Скорее всего, это одно и то же устройство. Это может произойти, например, если вы смонтируете одну и ту же сетевую файловую систему в разных местах. Учитывая, что это локальная файловая система, как указано в комментарии sourcejedi , очень вероятно, что это будет bind mount , созданная командой типа mount --bind / origin /var/www/username/data/www/test.site.biz/photo .

Если ваша система достаточно свежая, вы можете использовать findmnt , чтобы подтвердить, что это монтирование привязки . Но в любом случае большинство типов файловых систем не могут быть смонтированы одновременно в разных местах, поэтому наличие одного и того же устройства является достаточным доказательством того, что это монтирование с привязкой.

Привязка монтирования обеспечивает просмотр дерева каталогов в другом месте. С точки зрения доступа к файлам при монтировании привязки это похоже на наличие символической ссылки в дереве, то есть /var/www/username/data/www/test.site.biz/photo/somefile - это тот же файл, что и / origin / somefile , как если бы /var/www/username/data/www/test.site.biz/photo был символической ссылкой на / происхождение . Но /var/www/username/data/www/test.site.biz/photo - это не символическая ссылка, это каталог.

Поскольку /var/www/username/data/www/test.site.biz/photo является каталогом, в него спускается рекурсивный обход. Итак, rm -rf удалил файлы в папке / original , потому что / original и /var/www/username/data/www/test.site .biz / photo - это один и тот же каталог, который случайно отображается в разных местах.

25
25.12.2016, 16:23
2 ответа

Вы можете вставлять переменные только в строки с двойными кавычками.

Простой и безопасный способ сделать это - выйти из строки с одинарными кавычками следующим образом:

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>'"$str1"'</tag1><tag2>'"$str2"'</tag2>'

Обратите внимание, что после выхода из строки с одинарными кавычками я заключил переменные в двойные кавычки. Это сделано для того, чтобы обеспечить безопасность специальных символов внутри переменных.

Поскольку вы просили другой способ, вот неполноценная альтернатива с использованием printf:

xml=$(printf '<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>' "$str1" "$str2")

Она неполноценна, поскольку для достижения того же эффекта используется вложенная оболочка, что является ненужным дополнительным процессом.

Как написал в комментарии @steeldriver, в современных версиях bash можно написать так, чтобы избежать вложенной оболочки:

printf -v xml ' ... ' "$str1" "$str2"

Поскольку printf является встроенным модулем оболочки, эта альтернатива, вероятно, частично совпадает с моим первым предложением вверху.

37
27.01.2020, 19:40

Расширение переменной не происходит в строках с одинарными кавычками.

Вы можете использовать двойные кавычки для своей строки и избежать двойных кавычек внутри с помощью \ . Примерно так:

xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"

Результат вывода:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
11
27.01.2020, 19:40

Теги

Похожие вопросы