Расширение Bash не работает
У меня есть простая проблема с расширением скобки Bash:
#!/bin/bash
PICS="{x1,x2,x3}.jpg {y1,y2}.png"
for i in $PICS
do
echo $i
done
но результат таков:
{X1, x2, x3}.jpg
{Y1,y2}.png
Но я хочу, чтобы результат был: x1.jpg x2.jpg x3.jpg y1.png y2.png
что я должен делать?
4 ответа
Прямой путь
#!/bin/bash
for i in {x1,x2,x3}.jpg {y1,y2}.png; do
echo $i
done
Расширение скобок выполняется при анализе строки и не будет происходить внутри кавычек.
Расширение фигурных скобок и подстановочных знаков выполняется для аргументов при оценке команды. Измените первую строку на:
PICS=$(echo {x1,x2,x3}.jpg {y1,y2}.png)
Это файлы, которые уже существуют? Если да, вы, вероятно, хотите (ext)glob. Например
printf '%s\n' [xy]+([[:digit:]]).@(jp|pn)g
Расширение скобок в Bash - это первый шаг расширения. Это происходит главным образом в контекстах без кавычек, хотя точные правила сложны. Вы не можете сохранить его в строке, если не оценили результат позже.
printf '%s\n' {x{1..3}.jp,y{1,2}.pn}g
Они могут быть определены, как вы чувствуете. Смотрите другие ответы для менее запутанных вариантов.
Вы также должны процитировать ваши расширения.