Расширение 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

Они могут быть определены, как вы чувствуете. Смотрите другие ответы для менее запутанных вариантов.

Вы также должны процитировать ваши расширения.

Другие вопросы по тегам