В рыбной оболочке, как перебирать файлы, используя подстановочные знаки и переменные?

Если я бегу:

for f in *1000.png
   echo $f
end

я получил

1000.png
11000.png
21000.png

Я хотел бы сделать что-то вроде:

for i in 1 2 3
    for f in *$i000.png
         echo $f
    end
end

Получить

1000.png
11000.png
21000.png
2000.png
12000.png
22000.png
3000.png
13000.png
23000.png

Вместо этого он ничего не выводит.

Я также попробовал:

for i in 1 2
    set name "*"$i"000.png"
    for f in (ls $name)
        echo $f
    end
end

Выведение:

ls: *1000.png: No such file or directory
ls: *2000.png: No such file or directory

2 ответа

Решение

Когда вы пытаетесь сослаться на i переменная в *$i000.pngваша оболочка думает что $i000 означает, что вы пытаетесь сослаться на i000 переменная, не i следуют три ноля, как вы хотите.

использование {$var_name} чтобы получить доступ к переменным в fish, обычно хорошая идея всегда ссылаться на переменные оболочки таким образом.

Так что ваш случай, во второй строке используйте:

    for f in *{$i}000.png

Чтобы не пытаться расширить переменную $i000вы бы сделали

for i in 1 2 3
    for f in *{$i}000.png
         echo $f
    end
end

Или вообще избегайте внешнего цикла:

for f in *{1,2,3}000.png
Другие вопросы по тегам