如何在bash中重复几次几个字符?

时间:2010-08-06 12:39:28

标签: bash design-patterns repeat

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

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

其中image.png应该重复几次。

是否有重复模式的bash简写?

7 个答案:

答案 0 :(得分:10)

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

convert image.png{,,} many_images.png

将产生:

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

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

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

答案 1 :(得分: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

答案 2 :(得分:2)

#!/bin/bash

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

这可能对您有用:

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

这将在image.png

之前重复many_images.png 5次

答案 5 :(得分:0)

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

重复文件名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

这就是我们想要的。

答案 6 :(得分:0)

到目前为止我找到的最短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