Я пишу скрипт bash для форматирования своих разделов. Одна из команд, которые я хочу выполнить:

mkfs.btrfs -f -m single -L root /dev/sda1

Поэтому я разделил эту команду на часть параметров: -f -m single -L root и часть раздела: /dev/sda1 и поместил их в переменные следующим образом:

mkfs.btrfs "${myoptions}" /dev/"${mypartition}"

но это не с:

mkfs.btrfs: invalid option -- ´ ´

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

mkfs.btrfs "${array[1]}" "${array[2]}"

или вот так:

mkfs.btrfs "${array[*]}"

но это также не удается.

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

2 ответа2

3

Я также попытался поместить две части в массив ...

Не достаточно хорош. Каждый отдельный аргумент должен быть элементом массива (или единственным значением в переменной).

args1=(-f -m single -L root)
args2=/dev/"$mypartition"
mkfs.btrfs "${args1[@]}" "$args2"
0

Такие вещи всегда причиняют мне огромную боль. В этом случае, поскольку ни один из ваших аргументов не имеет пробелов, я бы попытался удалить двойные кавычки и позволить Bash разбить его на слова для вашей переменной $myoptions . Итак, это:

mkfs.btrfs ${myoptions} /dev/"${mypartition}"

С двойными кавычками вы получаете одно поле, -f -m single -L root содержащий пробелы. Без него он должен быть разбит на отдельные поля -f -m single -L и root и демонстрировать то же поведение, что и ввод mkfs.btrfs -f -m single -L root /dev/sda1 в интерактивной оболочке.

Если у вас есть аргументы, содержащие пробелы, вам, возможно, придется запутаться с переменной $IFS и вашей кодировкой.

Вы также можете использовать специальную переменную $@ которая имеет свои собственные правила.

Я пишу все свои оболочки в POSIX, так что я уверен, что в Bash есть более простой способ сделать это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .