У меня есть массив «опций» команды.
my_array=(option1 option2 option3)
Я хочу вызвать эту команду в скрипте bash, используя значения из массива в качестве параметров. Итак, command $(some magic here with my_array) "$1"
становится:
command -option1 -option2 -option3 "$1"
Как я могу это сделать? Является ли это возможным?
-
в начало каждого слова вmy_array
?Ответы:
Я бы предпочел простой
bash
способ:Одной из причин этого являются пробелы. Например, если у вас есть:
Эти
sed
растворы на основе преобразуют его в-option1 -option2 -with -space -option3
(длине 5), но выше ,bash
расширение будет превратить его в-option1 -option2 with space -option3
(длину еще 3). Редко, но иногда это важно, например:источник
somevar=("${my_array[@]/#/-}")
(Обратите внимание на круглые скобки вокруг значения.) Тогда, конечно , вы должны держать его обработки в виде массива при его использовании:echo "${somevar[@]}"
. Что касается функций, то здесь вы слишком ограничены возможностями языка. Вы можете передать массив:somefunc "${my_array[@]/#/-}"
, то внутри вы будете иметь его в$@
:function somefunc() { echo "$@"; }
. Но он также$@
будет содержать другие параметры, если таковые существуют, и никакой другой способ вернуть измененный массив, кроме stdout.@
подстрочный индекс? Я дал ему тест с zsh 5.5.1, и единственное отличие, которое я заметил, это то, что zsh добавлял префикс к каждому элементу, когда записывался как${my_array[@]/#/-}
, в то время как bash делал это и для*
подстрочного индекса.Я не обработал это, это было в массиве и думало отделенное пробелом в строке. Это решение будет работать с этим, но, учитывая, что это массив, используйте решение manatwork (
@{my_array[@]/#/-}
).Это не так уж и плохо с
sed
недоработкой. Насколько легко это регулярное выражение, зависит от того, что вы можете гарантировать о вариантах. Если все варианты - это одно «слово» (a-zA-Z0-9
только), тогда достаточно простого начального слова border (\<
):Если в ваших опциях есть другие символы (скорее всего
-
), вам понадобится нечто более сложное:^
соответствует началу строки,[ \t]
соответствует пробелу или табуляции,\|
соответствует любой стороне (^
или[ \t]
),\(
\)
группам (для\|
) и сохраняет результат,\<
соответствует началу слова.\1
начинает замену, сохраняя первое совпадение от parens (\(\)
), и,-
конечно, добавляет черту, которая нам нужна.Они работают с GNU SED, если они не работают с вашим, дайте мне знать.
И если вы будете использовать одну и ту же вещь несколько раз, вы можете просто рассчитать ее один раз и сохранить:
источник
gsed
(я установил с помощьюhomebrew
). И еще: вместо тогоecho $my_array
,echo ${my_array[@]}
чтобы получить все предметы , мне нужно было сделатьmy_array
:echo $my_array
давал мне только первый элемент. Но спасибо за ответ и объяснение регулярного выражения, особенно о «границе слова», это чрезвычайно полезно. :)[ $(echo x | sed 's/\</y/') == "yx" ] || exit
.источник