如何重复几个字符几次在bash?
-
26-09-2019 - |
题
在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"
自yes
,seq
和{1..3}
不POSIX。
有关的具体示例:
N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png
不隶属于 StackOverflow