Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中重复几个字符几次?_Bash_Design Patterns_Repeat - Fatal编程技术网

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

如何在bash中重复几个字符几次?,bash,design-patterns,repeat,Bash,Design Patterns,Repeat,在bash脚本中,我必须在一行中多次包含同一文件作为参数。像这样: convert image.png image.png image.png [...] many_images.png 其中,image.png应该重复几次 是否有一个bash速记来重复模式?#/bin/bash #!/bin/bash function repeat { for ((i=0;i<$2;++i)); do echo -n $1 " "; done } convert $(repeat imag

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

convert image.png image.png image.png [...] many_images.png
其中,
image.png
应该重复几次

是否有一个bash速记来重复模式?

#/bin/bash
#!/bin/bash

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

convert $(repeat image.png 3) many_images.png
功能重复{
对于((i=0;i),可以使用大括号展开:

convert image.png{,,} many_images.png
将产生:

convert image.png image.png image.png many_images.png
大括号扩展将为大括号内的每个逗号分隔字符串重复大括号之前(和之后)的字符串,生成一个包含前缀、逗号分隔字符串和后缀的字符串;并用空格分隔生成的字符串


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

这是一个使用数组的解决方案,因此对包含空格、换行符等的字符串非常有效

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

对于((i=0;i这适用于给定的整数(以下示例中为10)

它也可以与
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 $(printf "image.png %.s" {1..5}) many_images.png

这将在许多图像之前重复
image.png
5次。png

以避免使用$(command)或
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
这就是我们想要的。

到目前为止我找到的最短解决方案:

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

对于固定的、少量的重复,这是最好的解决方案,但对于大量或灵活的重复,这并不好用。这很好。我喜欢这样。但正如Philipp提到的,我不得不选择参数化的解决方案。你可以不用
declare
语句。在你的例子中,Bash将为y做正确的事情ou.您可以这样设置您的计数:
count=5
。数组将通过括号创建。可能的跨站点重复:
N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png