在bash脚本,我必须包括相同的文件几次连续作为参数。像这样:

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

其中image.png应重复几次。

是否有一个bash简写重复图案?

有帮助吗?

解决方案

此作品与给定的整数(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

其他提示

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

convert image.png{,,} many_images.png

会产生:

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

括号扩展之前(和之后)的括号用于产生一个字符串consiting前缀,逗号分隔的字符串和后缀的括号内的每个逗号分隔的字符串将重复串(一个或多个);并通过空间分离所产生的字符串。

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

#!/bin/bash

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

convert $(repeat image.png 3) many_images.png

下面是使用阵列中的溶液,并因此健壮含有空格的字符串,换行等

declare -a images
declare -i count=5
for ((i=0; i<count; ++i))
do
    images+=(image.png)
done
convert "${images[@]}" many_images.png

这对你可能工作:

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

此将重复image.png many_images.png前5次

要避免打开使用$(命令)的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

它是如何工作的。

$ {文件[0]}是相同$文件或$ {文件}

击第一确实括号扩展,所以它构成了一个序列是这样的:

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

猛砸好心让你获得忽略这些额外的数字

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

这简化到

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

和然后

$file $file $file

这就是我们想要的。

POSIX 7 溶液到目前为止我发现:

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

yesseq{1..3}不POSIX。

有关的具体示例:

N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top