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

发布于 2024-09-13 04:12:32 字数 195 浏览 4 评论 0原文

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

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

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

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

In a bash script, I have to include the same file several times in a row as an argument. Like this:

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

where image.png should be repeated a few times.

Is there a bash shorthand for repeating a pattern?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

如果没结果 2024-09-20 04:12:32

您可以使用大括号扩展来执行此操作:

convert image.png{,,} many_images.png

将生成:

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

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

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

You can do this using brace expansion:

convert image.png{,,} many_images.png

will produce:

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

Brace expansion will repeat the string(s) before (and after) the braces for each comma-separated string within the braces producing a string consiting of the prefix, the comma-separated string and the suffix; and separating the generated strings by a space.

In this case the comma-separated string between the braces and the suffix are empty strings which will produce the string image.png three times.

夏花。依旧 2024-09-20 04:12:32

这适用于给定的整数(在下面的示例中为 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

This works with a given integer (10 in the example below).

$ 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

It can also be used with 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
离鸿 2024-09-20 04:12:32
#!/bin/bash

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

convert $(repeat image.png 3) many_images.png
#!/bin/bash

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

convert $(repeat image.png 3) many_images.png
执手闯天涯 2024-09-20 04:12:32

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

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

Here is a solution that uses arrays and is thus robust for strings containing spaces, newlines etc.

declare -a images
declare -i count=5
for ((i=0; i<count; ++i))
do
    images+=(image.png)
done
convert "${images[@]}" many_images.png
羞稚 2024-09-20 04:12:32

这可能对你有用:

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

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

This might work for you:

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

This will repeat image.png 5 times before many_images.png

烟沫凡尘 2024-09-20 04:12:32

为了避免使用 $(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]}

Which 简化为

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

然后

$file $file $file

Which 是我们的想。

To avoid slow code that opens unnecessary instances of bash using $(command) or command you can use brace expansion.

To repeat a filename 3 times do:

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

or a more controversial version that uses a variable to specify number of repeated file names:

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

How it works.

${file[0]} is same as $file or ${file}

Bash does brace expansion first and so it makes up a sequence like this:

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

Bash kindly ignore these extra numbers so you get

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

Which simplifies to

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

and then

$file $file $file

Which is what we want.

诺曦 2024-09-20 04:12:32

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

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

因为seq{1..3} 不是 POSIX。

对于您的具体示例:

N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png

Shortest POSIX 7 solution I have found so far:

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

since yes, seq and {1..3} are not POSIX.

For your specific example:

N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文