скрипт bash: передача аргументов в mkfs

335
coverflower

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

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

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

mkfs.btrfs "$" /dev/"$" 

но это не с:

mkfs.btrfs: invalid option -- ´ ´ 

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

mkfs.btrfs "$" "$" 

или вот так:

mkfs.btrfs "$" 

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

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

0
Можете ли вы указать, как вы запустили скрипт в CLI? Может быть, вы просто поместите свои аргументы в кавычки. Например: $ script "-f -m single -L root" "sda1" Gautam 5 лет назад 0
Это, видимо, пробелы (все они), как писал @Ignacio Vazquez-Abrams. coverflower 5 лет назад 0

2 ответа на вопрос

3
Ignacio Vazquez-Abrams

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

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

args1=(-f -m single -L root) args2=/dev/"$mypartition" mkfs.btrfs "$" "$args2" 
0
BytePorter

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

mkfs.btrfs $ /dev/"$"

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

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

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

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

Я попробовал это: mkfs.btrfs $ / dev / "$ " снова, но это не сработало. Я взглянул на эту специальную переменную $ @, но если я не ошибаюсь, это функции, которые вы определяете сами, а не данные функции. coverflower 5 лет назад 1
Нет, вы правы, я думал, что удаление кавычек будет работать в этом конкретном случае и будет простым. `$ @` - это специальный параметр, с которым вы можете имитировать поведение массива, потому что у `sh` нет массива. Честно говоря, я пишу свои сценарии, чтобы они были `sh`-совместимыми, потому что они мне нравятся, и они поддерживаются во всех POSIX-совместимых оболочках, включая Bash. Если вам интересно просто для развлечения, http://www.etalabs.net/sh_tricks.html - это короткий, хорошо написанный и представленный список некоторых из наиболее полезных трюков (в том числе с использованием `$ @`). BytePorter 5 лет назад 0

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