在fish shell中,如何使用通配符和变量迭代文件?

ars*_*ius 3 fish

如果我跑:

for f in *1000.png
   echo $f
end
Run Code Online (Sandbox Code Playgroud)

我明白了

1000.png
11000.png
21000.png
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

for i in 1 2 3
    for f in *$i000.png
         echo $f
    end
end
Run Code Online (Sandbox Code Playgroud)

要得到

1000.png
11000.png
21000.png
2000.png
12000.png
22000.png
3000.png
13000.png
23000.png
Run Code Online (Sandbox Code Playgroud)

相反,它什么也没输出.

我也尝试过:

for i in 1 2
    set name "*"$i"000.png"
    for f in (ls $name)
        echo $f
    end
end
Run Code Online (Sandbox Code Playgroud)

输出:

ls: *1000.png: No such file or directory
ls: *2000.png: No such file or directory
Run Code Online (Sandbox Code Playgroud)

gle*_*man 8

为避免尝试扩展变量$i000,您可以这样做

for i in 1 2 3
    for f in *{$i}000.png
         echo $f
    end
end
Run Code Online (Sandbox Code Playgroud)

或者,完全避免外部循环:

for f in *{1,2,3}000.png
Run Code Online (Sandbox Code Playgroud)


Dir*_*rky 6

当您尝试引用 中的i变量时*$i000.png,您的 shell 认为这$i000意味着您正在尝试引用该i000变量,而不是i像您想要的那样跟随三个零。

使用{$var_name}访问变量中的鱼,通常它是一个好主意,总是引用shell变量这种方式。

所以你的情况,在第二行使用:

    for f in *{$i}000.png
Run Code Online (Sandbox Code Playgroud)