4

在 bash 脚本中,我必须连续多次包含同一个文件作为参数。像这样:

convert image.png image.png image.png [...] many_images.png

哪里image.png应该重复几次。

是否有用于重复模式的 bash 速记?

4

7 回答 7

10

您可以使用大括号扩展来做到这一点:

convert image.png{,,} many_images.png

将产生:

convert image.png image.png image.png many_images.png

大括号扩展将为大括号内的每个逗号分隔的字符串重复大括号之前(和之后)的字符串,从而产生一个由前缀、逗号分隔的字符串和后缀组成的字符串;并用空格分隔生成的字符串。

在这种情况下,大括号和后缀之间的逗号分隔字符串是空字符串,它将生成字符串 image.png 三次。

于 2010-08-06T13:26:18.687 回答
7

这适用于给定的整数(在下面的示例中为 10)。

$ echo $(yes image.png | head -n10)
image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png

它也可以用于xargs

$ yes image.png | head -n10 | xargs echo
image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png
于 2010-08-06T13:39:49.383 回答
2
#!/bin/bash

function repeat {
    for ((i=0;i<$2;++i)); do echo -n $1 " "; done
}

convert $(repeat image.png 3) many_images.png
于 2010-08-06T13:15:01.200 回答
2

这是一个使用数组的解决方案,因此对于包含空格、换行符等的字符串来说是健壮的。

declare -a images
declare -i count=5
for ((i=0; i<count; ++i))
do
    images+=(image.png)
done
convert "${images[@]}" many_images.png
于 2010-08-06T13:29:33.733 回答
0

这可能对您有用:

convert $(printf "image.png %.s" {1..5}) many_images.png

这将在之前重复image.png5 次many_images.png

于 2011-12-10T10:24:08.117 回答
0

为了避免使用 $(command) 打开不必要的 bash 实例的慢代码,或者command您可以使用大括号扩展。

要重复文件名 3 次,请执行以下操作:

file="image.png"; convert "${file[0]"{1..3}"}" many_images.png

或者一个更有争议的版本,它使用一个变量来指定重复文件名的数量:

n=10; file="image.png"; eval convert \"\${file[0]\"{1..$n}\"}\" many_images.png

这个怎么运作。

${file[0]} 与 $file 或 ${file} 相同

Bash 首先进行大括号扩展,因此它构成了这样的序列:

${file[0]1} ${file[0]2} ${file[0]3}

Bash 请忽略这些额外的数字,以便您获得

${file[0]} ${file[0]} ${file[0]}

这简化为

${file} ${file} ${file}

进而

$file $file $file

这就是我们想要的。

于 2014-03-08T06:50:30.497 回答
0

到目前为止我发现的最短的POSIX 7解决方案:

N=3
S="image.png "
printf "%${N}s" | sed "s/ /$S/g"

因为yes,seq并且{1..3}不是 POSIX。

对于您的具体示例:

N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png
于 2014-04-10T11:49:55.407 回答