Скрипт bash, который содержит
for i in {a,b}-{1,2}; do
echo $i;
done
печать
a-1
a-2
b-1
b-2
когда выполнено. Это то, что я ожидал - поскольку {a,b}
конструкция расширяется.
Однако когда (другой) скрипт содержит
v={a,b}-{1,2}
echo $v
это печатает
{a,b}-{1,2}
это не то, что я ожидал. Я ожидал, что это напечатает a-1 a-2 b-1 b-2
. Очевидно, что {a,b}
конструкция не расширена.
Я могу заставить его расширяться так
v=$(echo {a,b}-{1,2})
На основании этих наблюдений у меня есть два вопроса: 1) когда {a,b}
расширилась конструкция? 2) является $(echo {a,b}-{1,2})
ли предпочтительным способом вызвать расширение при необходимости?
bash
brace-expansion
Рене Ниффенеггер
источник
источник
=
. Например,v=a-1 a-2
не будет работать.v=a-1 a-2
означает,assign 'a-1' to variable v and run 'a-2'
v=(a-1 a-2)
присваивает массив переменнойv
.v+=(b-1 b-2)
добавляет к немуОтветы:
В руководстве по Bash сказано, что:
Расширение скобок отсутствует в списке, поэтому оно не выполняется для назначения
v={a,b}-{1,2}
. Как уже упоминалось в @Wildcard, простое расширение вv=a-1 v=b-1 ...
любом случае было бы бессмысленным.Кроме того, при выполнении
echo $v
, применяется следующее:Расширение фигурных скобок происходит до расширения переменных, поэтому назначенные фигурные скобки
$v
не расширяются.Но вы можете сделать что-то вроде этого:
Расширение с помощью
$(echo ...)
должно работать, если у вас нет пробелов в расширяемой строке, и, следовательно, не возникнут проблемы с разделением слов. Лучшим способом может быть использование переменной массива, если вы можете.например, сохранить расширение в массив и выполнить команду с расширенными значениями:
источник
Интересный момент. Возможно, полезна следующая выдержка из
man bash
:Обратите внимание, что расширение скобки НЕ упоминается в списке.
Однако это все еще оставляет вопрос, а именно: как оболочка узнает, что это присвоение переменной и, следовательно, не подлежит расширению скобки? Или, точнее, где последовательность разбора уточняется и кодифицируется таким образом, что оболочка определяется для определения переменных назначения, прежде чем она обрабатывает расширение скобки? (Это, очевидно, как
bash
работает, но я не нашел точную строку документации, описывающую это.)источник
LESS=+/SIMPLE man bash
).Насколько мне известно, {a, b, c} раскрывается, когда он напрямую отображается или используется командой, например: mkdir ~ / {a, b, c}, но когда он установлен в переменную, он должен быть оценен до повторяя это или используя это как аргумент!
так как у вас есть «a», за которым следует «b» в алфавитном порядке [az], и «1», за которым следует «2» в десятичном порядке [0-9]: вы можете использовать двойной период ".." insured of comma ", "
источник
v
не была задана буквенная строка «a-1 a-2 b-1 b-2». Или, по крайней мере, почему не было выдано никакой ошибки, если вы наберете команду:v=a-1 v=a-2 v=b-1 v=b-2
(к которой можно было бы рассчитывать, что назначение переменной будет расширено). Это хороший вопрос; это на самом деле не отвечает.Присвоение переменной в bash не расширяет выражение.
Для этого небольшого сценария x будет содержать,
"*"
а не расширение"*"
:Однако некоторые значения расширены, ref. хороший ответ от илккачу.
Выражения раскрываются при оценке.
Как это:
Или вот так:
Или вот так:
Запуск
$()
довольно распространен, и я думаю, что он предпочтительнееeval
, но лучше всего, вероятно, вообще не запускать оценку, пока переменная не будет фактически использована в команде.источник