Сценарий Bash не заменяет переменную должным образом

Нет. Вся суть LVM в том, что вы можете назначать пространство для LV независимо от того, где хранятся данные.

Кроме того, на самом деле это будет сложно, поскольку для этого нет команд.

1
02.09.2016, 11:52
2 ответа

Попробуйте заменить:

attr_marksweep_threadcount="-O java.lang:type=GarbageCollector,name='PS MarkSweep' -A LastGcInfo -K GcThreadCount"

на:

attr_marksweep_threadcount='-O java.lang:type=GarbageCollector,name="PS MarkSweep" -A LastGcInfo -K GcThreadCount'
0
27.01.2020, 23:47

Когда вы делаете это (перефразируя ваш более короткий пример в комментарии):

mkdir "foo bar"
parms="-l 'foo bar'"
ls $parms

Переменная parms разбивается на слова вдоль любого пробела, не обращая внимания на кавычки, так что получается. -l, 'foo, и bar' (три аргумента). В исходном примере была та же проблема с attr_marksweep_threadcount, и в итоге один из аргументов содержал java.lang:type=GarbageCollector,name='PS, а остальная часть процитированной строки - в другом аргументе. Предположу, что вашей java это не понравилось.

Если мы закавычим переменную, содержащую параметры:

ls "$parms"

Мы получим ls, вызванный с помощью -l 'foo bar' (один аргумент). Кавычки в переменной предотвращают разделение слов (и сглаживание имен файлов), а кавычки внутри переменной - нет.

Эту проблему сложно решить с простыми переменными оболочки, но поскольку в Bash есть массивы, вы можете использовать один из них и поместить каждый аргумент в отдельный элемент массива:

array=("-l" "foo bar")
ls "${array[@]}"

"${array[@]}" расширяется до эквивалента всех членов массива, взятых в кавычки.


В оболочках без массивов приходится использовать некоторые обходные пути. позиционные параметры могут быть расширены с помощью $@ аналогично массивам:

set -- "-l" "foo bar"
ls "$@"

Или, поскольку разбиение слов производится только по символам, установленным в IFS, мы можем сделать так, чтобы оболочка разбивалась не на пробелы, а на что-то другое.

IFS=#
parms='-l#foo bar'
ls $parms
# though IFS stays set to the hash sign after this

Вывод bash -x в вашем примере пытается показать, что происходит, но поскольку он пытается показать в одинарных кавычках строку, содержащую одинарную кавычку, вывод получается немного беспорядочным. Это: 'java.lang:type=GarbageCollector,name='\''PS' разбирается как 'java.lang:type=GarbageCollector,name=', \', и 'PS' все вместе, т.е. две строки в одинарных кавычках, и одна в кавычках. Что выглядит красивее в двойных кавычках: "java.lang:type=GarbageCollector,name='PS".

1
27.01.2020, 23:47

Теги

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